识别字符串中的电话号码

时间:2013-12-13 18:35:44

标签: php regex preg-match-all

我使用以下代码来检测字符串是否是电话号码......

<?php
$text = "example467676@gmail.com" ;
if (preg_match_all('/\+?[0-9][0-9()-\s+]{4,20}[0-9]/',$text)){
    echo "phone number";    
}else{
    echo "not a phone number";
}
?>

问题是我得到phone number我应该得到not a phone number ...我怎样才能解决这个问题...任何帮助都会受到赞赏。

3 个答案:

答案 0 :(得分:2)

问题是{4,20}将匹配前一个块出现4到20次的任何字符串,因此它匹配示例电子邮件地址中的数字。试试这个:

<?php
$text = "example467676@gmail.com" ;
if (preg_match_all('/^\+?([0-9-]|\s|\([0-9]+\)){4,20}[0-9]/',$text)){
    echo "phone number";    
}else{
    echo "not a phone number";
}
?>

Regular expression visualization

Debuggex Demo

Note that preg_match_all requires 3 parameters in PHP < 5.4

答案 1 :(得分:1)

preg_match_all()从第一场比赛开始直到最后一场比赛。

在这种情况下,第一场比赛将是4,并一直持续到6。忽略所有其他角色。

要使其从头开始,请在正则表达式之前使用^行锚的开头)。并强制它继续直到最后将$行结束)放在正则表达式的末尾。

像这样:

<?php
$text = "example467676@gmail.com" ;
if (preg_match_all('/^+?[0-9][0-9()-\s+]{4,20}[0-9]/$', $text)) {
  echo "phone number";  
} else{
  echo "not a phone number";
}
?>

答案 2 :(得分:0)

如果我理解你的问题,你的例子中的正则表达式即使有人输入带有数字的电子邮件地址也会返回匹配,就像你在那里一样。

使用^$来匹配 行的开头和结尾以避免这种情况:

<?php
$text = "example467676@gmail.com" ;
if (preg_match_all('^/\+?[0-9][0-9()-\s+]{4,20}[0-9]$/',$text)){
    echo "phone number";    
}else{
    echo "not a phone number";
}
?>

工作示例:http://regex101.com/r/xY0yU3