我需要在列表中定位最后一个顶级 LI 的起始标记,该列表可能包含或不包含各种位置的子列表 - 不使用CSS或Javascript.
是否有一个简单/优雅的正则表达式,可以帮助这个?我不是他们的大师,但当我选择所有中间文本(.*)/(.+)更改时,似乎需要贪婪/非贪婪的选择器,因为嵌套列表被添加并在列表 - 这让我失望了.
$pattern = '/^(<ul>.*)<li>(.+<\/li><\/ul>)$/';
$replacement = '$1<li id="lastLi">$3';
Run Code Online (Sandbox Code Playgroud)
也许有一个更简单的方法?转换为XML以定位LI然后转换回来?
即:单个元素
<ul>
<li>TARGET</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
多个元素
<ul>
<li>foo</li>
<li>TARGET</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
嵌套列表在结束之前
<ul>
<li>
foo
<ul>
<li>bar</li>
</ul>
<li>
<li>TARGET</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
结尾的嵌套列表
<ul>
<li>foo</li>
<li>
TARGET
<ul>
<li>bar</li>
</ul>
</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
您永远不应该使用正则表达式来解析HTML.特别是在这种特殊情况下(递归标签).
总的主要原因是HTML不是常规语言.
除了HTML不是常规语言并且无法使用正则表达式100%正确解析之外,正则解析HTML"足够好"的任务非常复杂,以至于你很可能不会有错误在你的代码中.
而是使用指定的HTML解析器.