我需要检索内容 <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'

变化:

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top