我需要在列表中定位最后顶级 LI的起始标记,该列表可能包含或不包含不同位置的子列表,而不使用CSS或Javascript。
是否有一个简单/优雅的正则表达式可以帮助解决这个问题?我不是他们的大师,但当我选择所有中间文本(。*)/(。+)更改时,似乎需要贪婪/非贪婪的选择器,因为嵌套列表被添加并在列表 - 这让我失望。
$pattern = '/^(<ul>.*)<li>(.+<\/li><\/ul>)$/';
$replacement = '$1<li id="lastLi">$3';
也许有一种更简单的方法?转换为XML以定位LI,然后转换回来?
即: 单个元素
<ul>
<li>TARGET</li>
</ul>
多元素
<ul>
<li>foo</li>
<li>TARGET</li>
</ul>
结束前的嵌套列表
<ul>
<li>
foo
<ul>
<li>bar</li>
</ul>
<li>
<li>TARGET</li>
</ul>
结尾的嵌套列表
<ul>
<li>foo</li>
<li>
TARGET
<ul>
<li>bar</li>
</ul>
</li>
</ul>
答案 0 :(得分:6)
You should never use regex to parse HTML。特别是在这种特殊情况下(递归标签)。
主要原因是HTML不是常规语言。
除了HTML不是常规语言并且无法使用正则表达式100%正确解析之外,正确解析HTML“足够好”的任务非常复杂,以至于你很可能不会去在你的代码中有bug。
相反,请使用designated HTML parser。
答案 1 :(得分:1)
使用html解析器而不是正则表达式。
答案 2 :(得分:1)
如果对必须处理哪种HTML数据有足够的信心,则XML转换和DOM解析是最简单的方法。