2010-06-07 63 views
0

我需要将列表中的最后一个顶层 LI的起始标记定位到列表中,该列表可能包含或不包含各种职位中的子列表 - 不使用CSS或Javascript。正则表达式目标列表中的最后一个主要列表

是否有一个简单/优雅的正则表达式可以帮助这个?我不是古茹w /他们,但当我选择所有中间文本(。*)/(。+)更改时,似乎需要贪婪/非贪婪选择器,因为嵌套列表被添加并在名单 - 这是抛弃我。

$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> 

回答

6

You should never use regex to parse HTML。特别是在这种特殊情况下(递归标签)。

总的来说,主要原因是HTML不是常规语言。

除了HTML不是一种常规语言,并且不能用正则表达式100%正确解析这一事实之外,正则表达式解析HTML的任务“足够好”已经足够复杂了,以至于你更有可能没有会在你的代码中出现错误。

而是使用designated HTML parser

+0

+1,更应如此,在这个情况下,这将是特别困难的事与正则表达式。正则表达式不适合递归结构。 (不,一些正则表达式引擎提供的“递归正则表达式”东西不是很好用。) – 2010-06-07 20:26:02

+1

+1,如果你想要顶级递归,这是非常困难的。我想知道谁降低了这一点,因为在这种情况下,这是完全正确的。事实并非总是如此,你不应该使用正则表达式来解析HTML,但这里肯定是。 – 2010-06-07 20:28:12

+1

虽然该链接是一个很好的(如幽默)阅读,但它并没有告诉OP很多“为什么”他/他不应该做这样的事情。我发现这样的答案(只发布到“html + regex线程”的链接)与LMGTFY链接的类型相同:不是SO的分支。因此我投了票。 – 2010-06-07 20:30:49

1

使用不是正则表达式的html解析器。

1

如果对于必须处理的HTML数据有足够的信心,XML转换和DOM解析是最简单的方法。