Помогите с помощью preg_match для телефонных номеров - PullRequest
0 голосов
/ 13 мая 2010

как написать оператор if, который найдет номера телефонов и сохранит их в переменной. Вот то, что я имею до сих пор, но это не работает.

if (preg_match('/^(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$
/', $buffer, $matches))
{
    $phonenumber = html_entity_decode($matches[1]);         
}

Ответы [ 2 ]

1 голос
/ 13 мая 2010

Поскольку вы используете preg_match(), я предполагаю, что вы используете PHP. Для телефонных номеров из-за их изменчивости даже в Н.Ам. (11, 10 или 7 цифр, переменные или не разделяющие символы и т. Д.) С такой функцией проще работать, чем с регулярным выражением:

function validphone(&$value) { //test for N.Am. phone number and reformat in standard format
    $valid=false;
    $area=NULL;
    $working=preg_replace('/\D/', '', $value); //only numbers left, no preceding zeros
    switch (strlen($working)) { //cases fall through from 11 to 7
        case 11: //e.g. 19024355764
            $working=stristr($working,'1'); //trims off 1st 1
        case 10: //e.g. 9024355764
            $area=substr($working,0,-7);
            $working=substr($working,3); //trims off 1st 3
        case 7: //e.g. 4355764
            $value=implode('-',array($area,substr($working,0,-4),substr($working,-4)));
            $valid=true;
            break;
        default:
            $valid=false;
            break;
    }
    return $valid;

}

ЕТА ваши вопросы в комментариях:

У вас есть строка, которая должна быть номером телефона

$phonish='blahblah#._foo(123)4567890 ixlybob';
if(validphone($phonish)){ //function checks if $phonish is valid & reformats it in a standard way
  //do something with $phonish, which now equals '123-456-7890'
} else {
  echo 'not a valid phone number';
}

Функция validphone() наиболее подходит для коротких строк, которые, как ожидается, будут телефонными номерами. Если вы сбросите всю страницу в строку, а затем добавите ее к validphone($mywholepage), она извлечет все числа в строке за один раз. Таким образом, текст с несколькими телефонными номерами вернет ложь, а текст, который распределен по 11,10 или 7 цифрам, вернет истину.

0 голосов
/ 13 мая 2010

В начале вы ищете необязательный +1 и некоторую жадную строку. Изменение

(?:[.-]\s*)?

до

(?:[.-]\d*?)?

должно сработать, но, возможно, в вашем регулярном выражении есть еще больше проблем.

...