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