0

我需要<p>用给定的类检索标签的内容。类可以是simplecommentcomment...

所以我写了下面的代码

preg_match("|(<p class=\"(simple)?comment(.*)?\">)(.*)<\/p>|ism", $fcon, $desc);

不幸的是,它什么也没返回。但是,如果我删除标签结束部分(<\/p>)它会以某种方式工作,返回太长的字符串(从标签开始到文档结尾)......

我的正则表达式有什么问题?

4

2 回答 2

2

尝试使用像http://simplehtmldom.sourceforge.net/这样的 dom 解析器

如果我正确阅读了 simplehtmldom 主页上的示例代码,您可以执行以下操作:

$html->find('div.simplecomment', 0)->innertext = '';
于 2009-08-14T12:00:07.960 回答
0

这里的快速修复如下:

'|(<p class="(simple)?comment[^"]*">)((?:[^<]+|(?!</p>).)*)</p>|is'

变化:

  • 该构造(.*)只会盲目匹配所有内容,这会阻止您的正则表达式工作,因此我已将这些实例完全替换为更严格的匹配:
    1. ... comment(.*)?... - 这将匹配全部或全部,基本上。我将其替换为[^"]*因为它将匹配零个或多个非"字符(基本上,它将匹配属性的结束"字符。class
    2. ... >)(.*)<\/p>... - 再次,这将匹配太多。我已经用一个匹配所有非字符的有效模式替换了它<,一旦它命中 a<它将检查它是否跟在</p>. 如果是,它将停止匹配(因为我们在<p>标签的末尾),否则它将继续。
  • 我删除了这个m标志,因为它在这个正则表达式中没有用。

它不可靠(想象一下<p class="comment">...<p>...</p></p>;它会匹配<p class="comment">...<p>...</p>)。

为了使其可靠,您需要使用递归正则表达式或(甚至更好)HTML 解析器(或 XML,如果您正在处理的是 XHTML。)甚至有一些库可以“正确”处理格式错误的 HTML(就像浏览器一样。)

于 2009-08-14T11:49:10.447 回答