我试图在PHP中写下一条正则表达式,这使我可以在另一个HTML标签的实例之前捕获HTML标签的最后一个实例。
例如,如果我有以下HTML:
<p>Para #1</p><p><a href="/path/to/keyword-here/21">Link Here</a> Para #2</p><p>Para #3</p>
我只想捕获以下内容,使用keyword-here
和21
的捕获组:
<p><a href="/path/to/keyword-here/21">Link Here</a> Para #2</p>
我尝试使用以下等级,但是在Para #2
之后,它最终从<p>Para #1
到</p>
,这太多了:
'#<p.*?<a .*?(keyword-here)/(d+).*?</a>.*?</p>#'
因为那不起作用,所以我尝试添加一个负面的lookahead如下,但这根本不会返回匹配:
'#<p(?!.*<p).*?<a .*?(keyword-here)/(d+).*?</a>.*?</p>#'
所以我现在被卡住了。第一个正则捕获太多,第二个正则是太限制了,根本不匹配任何东西。中间的平衡在哪里得到我追求的东西?
我想念什么?我是以错误的方式关闭还是完全接近这一点?谢谢。
使用domdocument和xpath,您可以使用以下代码...
$html = '<p>Para #1</p><p><a href="/path/to/keyword-here/1">Link Here</a><a href="/path/to/keyword-here/21">Link Here</a> Para #2</p><p>Para #3</p>';
$doc = new DOMDocument();
$doc->loadHTML($html);
$xp = new DOMXPath($doc);
$href = $xp->evaluate("string(//p/a[last()]/@href)");
echo $href;
给出...
/path/to/keyword-here/21
XPATH表达式-//p/a[last()]/@href
将在其下方查找具有<a>
元素的任何<p>
元素,[last()]
看起来像看起来一样,并将获得最后一个标签。然后@href
将获得HREF属性。
请注意,我将HTML更新到以/path/to/keyword-here/1
为HREF的新的第一个<a>
标签,但代码仍然返回/path/to/keyword-here/21
。