-1

我正在尝试在 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-hereand捕获组21

<p><a href="/path/to/keyword-here/21">Link Here</a> Para #2</p>

我尝试使用以下正则表达式,但它最终得到了从<p>Para #1</p>after的所有内容Para #2,这太多了:

'#<p.*?<a .*?(keyword-here)/(\d+).*?</a>.*?</p>#'

因为那不起作用,所以我尝试如下添加一个否定的前瞻,但这会导致根本不返回任何匹配项:

'#<p(?!.*<p).*?<a .*?(keyword-here)/(\d+).*?</a>.*?</p>#'

所以现在我被困住了。第一个正则表达式捕获太多,第二个限制太多,根本不匹配任何东西。中间的平衡在哪里得到我所追求的?

我错过了什么?我是否以错误的方式接近或完全接近这个?谢谢你。

4

1 回答 1

2

使用 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将查找其下<p>有一个<a>元素的任何元素,[last()]它看起来会执行并将获取最后一个标记。然后@href会得到href属性。

请注意,我更新了 HTML 以包含一个新的第一个<a>标签,/path/to/keyword-here/1作为 href,但代码仍然返回/path/to/keyword-here/21.

于 2019-08-01T19:27:23.077 回答