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