我的正则表达式有一个小问题,我用来从强大的
中提取电话号码<?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作为我不需要的结果之一 实际上我不知道我的模式中缺少的部分在哪里。
答案 0 :(得分: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
答案 1 :(得分: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);