我如何在PHP中编写一条正则是在另一个HTML标签之前捕获HTML标签的最后一次出现



我试图在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-here21的捕获组:

<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

相关内容

  • 没有找到相关文章

最新更新