所以基本上我的正则表达式没有像我期望的那样工作我不知道为什么。
我在一个相当规范的环境中工作,所以这不应该是一个太大的问题 - 所有的html标签都是由脚本生成的。请遵循以下模式:仅存在li
,p
和h(3-6)
标记。所有文本都在标签之间,标签之间没有空格。
我需要用li
标签围绕ul
来写一些内容。这是我得到的:
preg_replace('#(<li>[^<p|<h]+</li>)(?!<li>)#', '<ul>$1</ul>', $html)
但是由于某种原因,它只匹配集合中的最后一个li
对。任何人都可以告诉我为什么......拜托?
答案 0 :(得分:3)
[^<p|<h]
没有达到您的预期。它匹配不是任何字符<p|h
的单个字符。如果您的HTML确实与您说的一样受限制,并且您无法将<li>
嵌套在另一个<li>
内,则以下内容应该有效:
preg_replace('#(<li>.*?</li>)+#', '<ul>$0</ul>', $html)
序列.*?
与.*
类似,只是尾随的?
是非贪婪的修饰符。默认情况下,.*
是贪婪的 - 它会消耗尽可能多的字符,然后在模式的其余部分不匹配时回溯。非贪婪修饰符将此反转。它消耗尽可能少的字符,如果模式的其余部分不匹配则前进。由于模式的其余部分只是</li>
,因此有效地捕获了所有文本,但不包括第一个序列</li>
。然后将此模式嵌套在捕获中,然后使用+
重复捕获,这意味着它将匹配<li>
个标记的一个或多个序列。