RegEx不支持预测!

时间:2010-07-18 02:34:03

标签: php regex preg-match

嘿伙计们,我正在尝试匹配此页面中的“地址” -

http://www.bbb.org/norfolk/business-reviews/tax-return-preparation/liberty-tax-service-in-virginia-beach-va-48000604

地址来源部分有此HTML

<tr>
    <td align="right" class="generalinfo_left">Address:</td>
    <td class="generalinfo_right">1 S Main St Ste 1430<br /></td>
</tr>
<tr>
    <td align="right" class="generalinfo_left"></td>
    <td class="generalinfo_right">Dayton, OH 45402</td>
</tr>

所以,我在PHP中尝试了以下RegEx。

"%Address:</td>(.*?)(?!<br />)</td>%s"

其中“s”是“。”的修饰符。也匹配新的线路。但它没有用。它与“Dayton,OH 45402”部分不匹配。谁能告诉我为什么?

3 个答案:

答案 0 :(得分:1)

请不要尝试使用正则表达式解析HTML,invokes the wrath of Zalgo

尝试使用the DOMxpath来定位您尝试提取的特定元素和属性。

(我提供了一个xpath示例,但它仍然在我的学习列表中... :))

答案 1 :(得分:0)

.*?一直到<br />的末尾。然后,下一个文本是“</td>”,因此前瞻失败并且匹配成功,捕获为"<td class="generalinfo_right">1 S Main St Ste 1430<br />"。换句话说,前瞻并不会阻止匹配,因为它太晚了。

有一些方法可以正确地编写它(例如,您可以明确添加<tr>然后<td class="generalinfo_right">。但是,Charles应该使用真正的解析器。

答案 2 :(得分:0)

这是很正常的:如果你查看你的示例文本,你会看到在地址和代顿之间,OH 45402,你<br />. (?!<br />)明确指出如果找到<br />它不匹配。

您应该使用HTML解析器。

那就是说,假设你的所有文件都与这个样本完全一样,这个丑陋的正则表达式应该可以工作:

%(Address:)(.*?generalinfo_right">)(.*?)((<br />)|(</td>))(.*?generalinfo_right">)(.*?)((<br />)|(</td>))%s

第1,3和8组包含地址。

但是,由于您的文档很可能并非完全相同,因此更好的解决方案是使用正确的解析器解析HTML。