我无法捕获这些数据:
<tr>
<td><span class="bodytext"><b>Contact:</b><b></b></span><span style='font-size:10.0pt;font-family:Verdana;
mso-bidi-font-family:Arial'><b> </b>
<span class="bodytext">John Doe</span>
</span></td>
</tr>
<tr>
<td><span class="bodytext">PO Box 2112</span></td>
</tr>
<tr>
<td><span class="bodytext"></span></td>
</tr>
<!--*********************************************************
-->
<tr>
<td><span class="bodytext"></span></td>
</tr>
<tr>
<td><span class="bodytext">JOHAN</span> NSW 9700</td>
</tr>
<tr>
<td><strong>Phone:</strong>
02 9999 9999
</td>
</tr>
基本上,我希望在“联系人:”之后和“电话:”之前删除所有内容。但是这两个名称可能并不总是存在,所以我需要真正抓住不在HTML标签内的两个冒号(:)之间的所有内容。
<span class="bodytext">***data***</span>
的数量实际上可能会有所不同,所以我需要某种循环来匹配这些。
我更喜欢使用正则表达式,因为我可能可能使用循环和字符串匹配来执行此操作。
另外,我想知道PHP regex中非匹配组的语法。
非常感谢任何帮助!
答案 0 :(得分:2)
如果我理解正确,您只对HTML标记之间的文本感兴趣。要忽略HTML标记,只需先剥离它们:
$text = preg_replace('/<[^<>]+>/', '', $html);
要获取“联系人:”和“电话:”之间的所有内容,请使用:
if (preg_match('/Contact:(.*?)Phone:/s', $text, $regs)) {
$result = $regs[1];
} else {
$result = "";
}
要抓住两个冒号之间的所有内容,请使用:
if (preg_match('/:([^:]*):/', $text, $regs)) {
$result = $regs[1];
} else {
$result = "";
}
答案 1 :(得分:0)
看似随意的堆栈溢出响应这些问题似乎是“omg不使用正则表达式!使用Beautiful Soup代替!!”。就个人而言,我更喜欢不必使用外部库来完成这样的小任务,并且正则表达式是一个很好的替代方案。
剥离所有HTML标记的一种简单方法是使用此正则表达式来解决此问题:
$text = preg_replace("/<.*?>/", "", $text);
然后您可以使用您喜欢的任何方法来获取相应的文本内容。
非匹配组如下:(?:this won't match)
答案 2 :(得分:0)
听起来像screenscraping,或者在找到您想要的信息后也可以使用strip_tags()。