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

时间:2010-06-07 20:20:20

标签: php html regex

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

3 个答案:

答案 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解析是最简单的方法。