我有几个段落标签的列表。每个都没有任何属性,例如。
<p>First paragraph</p>
<p>Second paragraph</p>
<p>Third paragraph</p>
我的目标是找到最后一个开放<p>
标记 - 无论我只有一个段落还是十个段落。我总是希望最后一段开头标记。
用
/<p>/
我得到第一段标签。我认为$
将搜索方向从左到右,从右到左反转。所以基本上
/<p>$/
应该从上面的示例中返回第三段的开头段落标记;但正则表达式一无所获。
那么如何最好地定位最后一段?
答案 0 :(得分:4)
答案 1 :(得分:3)
答案 2 :(得分:0)
这应该有效:
preg_match_all('#<p>.*</p>#',$string,$results);
$last_paragraph = array_pop($results[0]);
答案 3 :(得分:0)
尝试这样的事情:
(<p>)([^<]*)<\/p>$
这是一个用您提供的示例输入来测试模式的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查询。