php - 正则表达式问题 - 如果我知道如何正确提问,我也会正确地知道答案吗?

标签 php regex

所以基本上我的正则表达式没有按我的预期工作,我不知道为什么。

我在一个相当受监管的环境中工作,所以这不应该是太大的问题 - 所有 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/

相关文章:

javascript - php + js 结帐和感谢页面

php - 使用 php 包含 header 和元标记

php - 在脚本执行期间显示启动画面

需要 Javascript 正则表达式

Analytics 目标 channel 中动态 URL 的正则表达式

php - Composer Autoload.php 未在实时托管的命名空间和类中加载

javascript - 激活弹出窗口(HTML、PHP、Javascript/Jquery)

java - 当子字符串不唯一时如何使用正则表达式?

java - 正则表达式匹配 "four characters, followed by an unknown No of digits."

python - 用于查找最多包含 3 个字母数字字符的所有字符串的正则表达式模式