如何使用regexp匹配<li> </li>块

时间:2010-06-24 09:48:31

标签: php regex

如何匹配

<li>item 1</li>
<li>item 2</li>

无论块之前还是之后都有空白行 并使用PHP <ul></ul>将其封装在preg_*标记中 功能

感谢您的回答

2 个答案:

答案 0 :(得分:2)

如果这是安全的,受控制的输入,并且您刚刚获得缺少父级UL的LI,您可以这样做:

preg_replace ( '#\s*(?:<li>.*</li>\s*)+#' , '<ul>$0</ul>', $input )

(您可能希望在UL之前或之后向替换字符串添加一些\n。)

注意:如果出现以下情况,则会失败:

  • 内容中有任何现有的UL / OL列表。
  • 连续列表项之间还有空格以外的任何内容。
  • 任何LI跨越多行(.默认排除换行符。)
  • LI上有任何属性。
  • 可能是我没有考虑过的一些事情。

其中一些可以相对容易地满足,但我不打算 - 如果你还没有知道具体内容,你应该使用real HTML parser代替。

正则表达式中的“常规”具有特定含义,完整HTML a Regular language,因此尝试使用简单正则表达式处理HTML的所有复杂性可能会失败。
如果您在用户提供的HTML上使用了错误的正则表达式,则可能会在代码中引入HTML injection vulnerabilities

答案 1 :(得分:1)

大卫已经说过,php有xml和html-parsers。但是,如果你真的想使用正则表达式,它可能会像:

preg_match('#<li>(.*?)</li>#', $string);
// Same thing
preg_match('#<li>(.*)</li>#U', $string);