我正在使用preg_match_all()
从网页抓取电话号码,但收到错误preg_match_all() [function.preg-match-all]: Compilation failed: nothing to repeat at offset 20
我的PHP代码:
preg_match_all(
'/<div class="phone">(*.?)<\/div>/s',
$html,
$array,
PREG_SET_ORDER
);
正则表达式代码:
<div class="phone">
(617) 495-5758
</div>
为什么(*.?)
不能处理电话号码,如何编辑代码以使其正常使用电话号码?
答案 0 :(得分:3)
*
表示“重复前面的原子”。但它遵循(
,它是一个特殊的字符,而不是一个原子。
您是否意味着.*?
(任何数量的任何角色,非贪婪)?
答案 1 :(得分:1)
尝试:
'/&lt; div class =“phone”&gt;([^&lt;] +)&lt; / div&gt; / s'
答案 2 :(得分:1)
(*.?)
应为(.*?)
。
preg_match_all(
'/<div class="phone">(.*?)<\/div>/s',
$html,
$array,
PREG_SET_ORDER
);
答案 3 :(得分:1)
前几天刚刚阅读this article,添加评论下的第一个示例专门运行了一个正则表达式电话号码过滤器。希望它有所帮助
答案 4 :(得分:1)
它不匹配,因为有换行符:
<div class="phone"> <!-- break -->
(617) 495-5758 <!-- break -->
</div>
要解决此问题,请使用/sm
而不是/s
。此外,您的regEx也有错误,ti应该是.*
而不是*.
。
请参阅此处的工作示例: http://www.rubular.com/r/94bgLmDzac
答案 5 :(得分:-1)
因为它应该是(.*?)
而不是(*.?)
。这是一个更好的正则表达式:
preg_match_all('~<div class="phone">\s*(.+?)\s*</div>~s', $html, $array, PREG_SET_ORDER);