regexp目标列表中的最后一个主要li

vei*_*lig 0 html php regex

我需要在列表中定位最后一个顶级 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)

DVK*_*DVK 6

您永远不应该使用正则表达式来解析HTML.特别是在这种特殊情况下(递归标签).

总的主要原因是HTML不是常规语言.

除了HTML不是常规语言并且无法使用正则表达式100%正确解析之外,正则解析HTML"足够好"的任务非常复杂,以至于你很可能不会有错误在你的代码中.

而是使用指定的HTML解析器.

  • @DVK:请注意我首先投票然后输入原因.但我当然可以自由地在没有提供理由的情况下向你投票!:).无论如何,我删除了它,因为你扩展了答案,为什么不应该这样做. (2认同)