我有一个包含大量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>
元素?
答案 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 - 查找字符串中最后一次出现的位置