因此,基本上我的正则表达式没有像我期望的那样工作&我不知道为什么。
我在一个相当规范的环境中工作,所以这应该不是太大的问题-所有的html标签都是由脚本生成的&遵循这个模式:只有li,p和h(3-6)标签存在。所有文本都在标签之间,标签之间没有空格。
我“需要”写一些东西来用ul标签包围li。下面是我得到的信息:
preg_replace('#(<li>[^<p|<h]+</li>)(?!<li>)#', '<ul>$1</ul>', $html)但是,由于某些原因,它只匹配集合中的最后一个li对。谁都能告诉我为什么..。请?
发布于 2011-03-04 10:55:09
[^<p|<h]不会做您期望的事情。它匹配的单个字符不是任何字符<p|h。如果您的超文本标记语言确实如您所说的那样受约束,并且您不能将一个<li>嵌套在另一个<li>中,那么下面的方法应该是可行的:
preg_replace('#(<li>.*?</li>)+#', '<ul>$0</ul>', $html)序列.*?与.*类似,只是尾部的?是非贪婪修饰符。默认情况下,.*是贪婪的-它将尽可能多地使用字符,然后在模式的其余部分不匹配时回溯。非贪婪修饰符颠倒了这一点。它使用尽可能少的字符,并在模式的其余部分无法匹配时前进。因为模式的其余部分只是简单的</li>,所以这有效地捕获了直到(但不包括)第一个序列</li>的所有文本。然后将此模式嵌套在捕获中,然后使用+重复捕获,这意味着它将匹配一个或多个<li>标记序列。
https://stackoverflow.com/questions/5189118
复制相似问题