从字符串中获取最后的<li>元素</li>

时间:2010-01-20 10:41:38

标签: php html

我有一个包含大量HTML标记的字符串变量,我想从中获取最后一个<li>元素。 我正在使用类似的东西:

$markup = "<body><div><li id='first'>One</li><li id='second'>Two</li><li id='third'>Three</li></div></body>";

preg_match('#<li(.*?)>(.*)</li>#ims', $markup, $matches);
$lis = "<li ".$matches[1].">".$matches[2]."</li>";
$total = explode("</li>",$lis);
$num = count($total)-2;
echo $total[$num]."</li>";

这有效,我打印出最后一个<li>元素。但我不明白为什么我必须减去数组$total的最后2个索引。通常情况下,我只会减去自索引0开始计数以来的最后一个索引。我缺少什么?

是否有更好的方法从字符串中获取最后一个<li>元素?

6 个答案:

答案 0 :(得分:6)

HTML不常规,因此无法使用正则表达式进行解析。使用proper HTML parser

答案 1 :(得分:1)

@OP,您的要求看起来很简单,因此不需要解析器或正则表达式。

$markup = "<body><div><li id='first'>One</li><li id='second'>Two</li><li id='third'>Three</li></div></body>";
$s = explode("</li>",$markup,-1);
$t = explode(">",end($s));
print end($t);

输出

$ php test.php
Three

答案 2 :(得分:1)

如果您已经知道如何使用jQuery,还可以查看phpQuery。它是一个PHP库,允许您轻松访问dom元素,就像在jQuery中一样。

答案 3 :(得分:0)

来自PHP.net文档:

If matches is provided, then it is filled with the results of search. $matches[0] will contain the text that matched the full pattern, $matches[1] will have the text that matched the first captured parenthesized subpattern, and so on.

$ matches [0]是完全匹配(不仅仅是捕获的位)

答案 4 :(得分:0)

您必须提取第二个索引,因为您有2个捕获分组:

$matches[0]; // Contains your original string
$matches[1]; // Contains the argument for the LI start-tag (.*?)
$matches[2]; // Contains the string contained by the LI tags (.*)

'解析'(x)html字符串与正则表达式很难并且可能充满意想不到的问题。解析不仅仅是简单的标记字符串是不可能的,因为(x)html不是常规语言。

你可以通过使用(未经测试)来提高你的正则表达式:

 /#<li([^>]*)>(.+?)</li>#ims/

答案 5 :(得分:0)

strrpos - 查找字符串中最后一次出现的位置