嘿伙计们,我正在尝试匹配此页面中的“地址” -
地址来源部分有此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”部分不匹配。谁能告诉我为什么?
答案 0 :(得分:1)
请不要尝试使用正则表达式解析HTML,invokes the wrath of Zalgo。
尝试使用the DOM和xpath来定位您尝试提取的特定元素和属性。
(我提供了一个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。