帮助将preg_match用于电话号码

时间:2010-05-13 17:59:36

标签: php regex preg-match pcre

我将如何编写一个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 个答案:

答案 0 :(得分:1)

由于你正在使用preg_match(),我假设你正在使用PHP。对于电话号码,因为它们的可变性甚至在N.Am. (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;

}

在评论中ETA你的问题:

您的字符串应为电话号码

$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),它会立即提取所有字符串中的数字。因此,具有多个电话号码的文本将返回false,并且恰好分布有11,10或7位数字的文本将返回true。

答案 1 :(得分:0)

一开始,您搜索可选的+1和一些贪婪的字符串。改变

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

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

应该可以解决问题,但也许你的正则表达式中存在更多问题。