如何找到最后一个段落元素?

时间:2015-01-18 22:04:18

标签: php regex

我有几个段落标签的列表。每个都没有任何属性,例如。

<p>First paragraph</p>
<p>Second paragraph</p>
<p>Third paragraph</p>

我的目标是找到最后一个开放<p>标记 - 无论我只有一个段落还是十个段落。我总是希望最后一段开头标记。

/<p>/

我得到第一段标签。我认为$将搜索方向从左到右,从右到左反转。所以基本上

/<p>$/

应该从上面的示例中返回第三段的开头段落标记;但正则表达式一无所获。

那么如何最好地定位最后一段?

6 个答案:

答案 0 :(得分:4)

$不会改变搜索方向,只是在文本末尾匹配,这就是全部。

如果您想查找最后一个<p>,则必须使用否定lookahead来断言<p>不再发生任何事件:

(?s)<p>(?!.*<p>)

答案 1 :(得分:3)

使用此模式

[\s\S]*\K(<p>)

Demo

答案 2 :(得分:0)

这应该有效:

preg_match_all('#<p>.*</p>#',$string,$results);
$last_paragraph = array_pop($results[0]);

答案 3 :(得分:0)

尝试这样的事情:

(<p>)([^<]*)<\/p>$

Regular expression visualization

Debuggex Demo

这是一个用您提供的示例输入来测试模式的PHP演示...

<?php 

$test = <<<TEST
<p>First paragraph</p>
<p>Second paragraph</p>
<p>Third paragraph</p>
TEST;

preg_match('/<p>([^<]*)<\/p>$/', $test, $matches);

var_dump($matches);

?>

...,输出:

array(3) {
  [0]=>
  string(22) "<p>Third paragraph</p>"
  [1]=>
  string(3) "<p>"
  [2]=>
  string(15) "Third paragraph"
}

你也可以run the PHP demo on Ideone

如您所见,模式匹配最后一个段落元素。我刚刚为捕获组添加了括号,让您可以选择将最后一个段落元素本身作为其开始标记的文本。

答案 4 :(得分:0)

$str = <<<MYFILE
<p>First paragraph</p>
<p>Second paragraph</p>
<p>Third paragraph</p>
MYFILE;
$matches = array();
$pattern = '/.*?(<p>(.*)<\/p>)$/';
preg_match($pattern,$str,$matches);

var_dump($matches);

答案 5 :(得分:0)

使用XPath的DOM方法

$doc = new DOMDocument();
$doc->loadHTML("<p>First paragraph</p><p>Second paragraph</p><p>Third paragraph</p>");

$xpath = new DOMXpath($doc);
if($elements = $xpath->query("//p[last()]"))
{
  echo $elements->item(0)->nodeName; // p
  echo $elements->item(0)->nodeValue; // Third paragraph
}

如果你有一个更复杂的HTML结构,你必须开始明确你的XPath查询。