【问题标题】:Help using preg_match for phone numbers帮助将 preg_match 用于电话号码
【发布时间】:2010-05-13 17:59:36
【问题描述】:

我将如何编写一个 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]);         
}

【问题讨论】:

  • 您能否提供一些您想要匹配的电话号码以及您不想匹配的号码的示例?或者至少有一些更详细的要求?
  • 你能解释一下它在什么方面不起作用吗?你能举一个失败的例子,它给出了什么输出,以及你的期望吗?
  • 这个。是一个完美的“两个问题”的例子。
  • 它需要匹配 3334445555、333.444.5555、333-444-5555、333 444 5555、(333) 444 5555 及其所有组合。
  • 那么 1-333-444-5555 呢? 333-444-5555x1234怎么样?

标签: php regex preg-match pcre


【解决方案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 你在 cmets 中的问题:

你有一个应该是电话号码的字符串

$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。

【讨论】:

  • 还是不知道。如果我将它添加到代码中,我如何将它返回到变量中
  • @Kirk:该函数是通过引用传递的,因此原始的$value 被重新格式化的@ 替换,如果它存在并且返回一个布尔值以便您知道它是否有效。像这样称呼它if(validphone($phonish)) //do something。就您如何确定 $phonish 中的内容而言,听起来您犯了使用正则表达式解析 HTML 的主要罪行。不。有更好更简单的选择。只需在 SO 中搜索 HTML 和正则表达式 - 这是最流行的问题之一。
  • 我不知道如何正确调用这个函数。你能帮帮我吗?
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 2023-04-05
    相关资源
    最近更新 更多