3

我的正则表达式有一个小问题,我用它来从强项中提取电话号码

<?php
$output = "here 718-838-3586 there 1052202932 asdas dasdasd 800-308-4653 dasdasdasd 866-641-6949800-871-0999";
preg_match_all('/\b[0-9]{3}\s*[-]?\s*[0-9]{3}\s*[-]?\s*[0-9]{4}\b/',$output,$matches);
echo '<pre>';
print_r($matches[0]);
?>

输出

Array
(
            [0] => 718-838-3586
            [1] => 1052202932
            [2] => 800-308-4653
            [3] => 866-641-6949
            [4] => 800-871-0999

)

这工作正常,但它返回 1052202932 作为我不需要的结果之一。
实际上我不知道我的模式中缺少的部分在哪里。

4

2 回答 2

2

? 在正则表达式中表示 {0,1} 并且您的模式中需要恰好出现 1 次“-”

preg_match_all('/\b[0-9]{3}\s*-\s*[0-9]{3}\s*-\s*[0-9]{4}\b/',$output,$matches);

欲了解更多信息http://www.php.net/manual/en/regexp.reference.repetition.php

于 2013-06-24T22:13:45.790 回答
2

?每个之后[-]都是-可选的。如果您希望它是必需的,您可以删除?将使其成为必需的。另外,[-]相当于-我去掉了不必要的字符类:

preg_match_all('/\b[0-9]{3}\s*-\s*[0-9]{3}\s*-\s*[0-9]{4}\b/',$output,$matches);

您还可以将所有的替换为[0-9]进一步\d缩短它:

preg_match_all('/\b\d{3}\s*-\s*\d{3}\s*-\s*\d{4}\b/',$output,$matches);
于 2013-06-24T22:15:45.520 回答