正则表达式在html中查找特定的表

时间:2019-01-15 02:19:50

标签: php regex

我有html像这样的底部。并使用PHP

<table style="...">
<tbody>
<tr> <img id="foo" src="foo"/></tr>
</tbody>
</table>
<p> ....</p>
<table style="...">
<tbody>
<tr> <img id="bar" src="bar"/></tr
</tbody>
</table>

我正在开始使用PHP。 我想找到特定的表,例如img src或id等于foobar。 但选择了两个表。 这是我的正则表达式 1.查找表具有img标签

    /<table.*?>.*?<img *.*?<\/table>/

->选择2张桌子

2.add img src

<table.*?<img.+(src=.*?foo).*?<\/table>

->从第一个标签到最后一个标签全部选中

3.so尝试在...标记之间不要包含</table>

<table.*?(?!<\/table>).*?<img.+(src=.*?foo).*?<\/table>

->相同的结果 我不知道怎么了! 我使用preg_match_all()解决了,但仍然想知道preg_match() 有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

这项工作非常适合使用PHP DOMDocumentDOMXPath类。在这种情况下,我们使用xpath搜索具有table且其img属性等于src'foo'的后代是'bar'的{​​{1}} :

$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
$footable = $xpath->query("//table[descendant::img[@src='foo']]");
echo $footable->item(0)->C14N() . "\n";
$bartable = $xpath->query("//table[descendant::img[@src='bar']]");
echo $bartable->item(0)->C14N() . "\n";

输出:

<table style="..."><tbody><tr><img id="foo" src="foo"></img></tr></tbody></table>
<table style="..."><tbody><tr><img id="bar" src="bar"></img></tr></tbody></table>

Demo on 3v4l.org