正则表达式问题 - 检索给定类的标签内容 - preg_match(_all)
-
16-09-2019 - |
题
我需要检索内容 <p>
具有给定类别的标签。类可以是 simplecomment
或者 comment
...
所以我写了下面的代码
preg_match("|(<p class=\"(simple)?comment(.*)?\">)(.*)<\/p>|ism", $fcon, $desc);
不幸的是,它什么也没返回。但是,如果我删除标签结尾部分(<\/p>
)它以某种方式工作,返回太长的字符串(从标签开始到文档结尾)...
我的正则表达式有什么问题?
解决方案
尝试使用DOM解析器如 http://simplehtmldom.sourceforge.net/
如果我正确读取上simplehtmldom主页上的示例代码 你可以做这样的事情:
$html->find('div.simplecomment', 0)->innertext = '';
其他提示
这里的快速修复如下:
'|(<p class="(simple)?comment[^"]*">)((?:[^<]+|(?!</p>).)*)</p>|is'
变化:
- 构造
(.*)
只会盲目匹配所有内容,这会阻止您的正则表达式工作,因此我已用更严格的匹配完全替换了这些实例:- ...
comment(.*)?
...– 基本上,这将匹配全部或全部。我用这个替换了[^"]*
因为它将匹配零个或多个非"
字符(基本上,它将匹配结束字符"
的性格class
属性。 - ...
>)(.*)<\/p>
...– 再次,这会匹配太多。我已将其替换为一种有效的模式,该模式将匹配所有非<
角色,一旦击中<
它将检查后面是否有</p>
. 。如果是,它将停止匹配(因为我们已经到了末尾)<p>
标签),否则将继续。
- ...
- 我删除了
m
标志,因为它在此正则表达式中没有用处。
但 它不会可靠(想象一下 <p class="comment">...<p>...</p></p>
;它将匹配 <p class="comment">...<p>...</p>
).
为了使其可靠,您需要使用递归正则表达式或(甚至更好)HTML 解析器(如果您正在处理 XHTML,则使用 XML。)甚至有一些库可以“正确”处理格式错误的 HTML(就像浏览器一样。)
不隶属于 StackOverflow