2009-08-14 35 views
0

我需要检索给定类的<p>标签的内容。类可能是simplecommentcomment ...RegEx问题 - 检索给定类的标签内容 - preg_match(_all)

所以我写了下面的代码

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

不幸的是,它没有返回。但是,如果我删除了标记结束部分(<\/p>),它会以某种方式起作用,使得字符串过长(从标记开始到文档结束)...

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

回答

2

尝试使用DOM解析器像http://simplehtmldom.sourceforge.net/

(如浏览器做的。):

$html->find('div.simplecomment', 0)->innertext = ''; 
+0

建议第三第三方替代[SimpleHtmlDom](http://simplehtmldom.sourceforge.net/)实际使用[DOM](http://php.net/manual/en/book.dom.php)而不是字符串分析:[phpQuery ](http://code.google.com/p/phpquery/),[Zend_Dom](http://framework.zend.com/manual/en/zend.dom.html),[QueryPath](http:/ /querypath.org/)和[FluentDom](http://www.fluentdom.org)。 – Gordon 2010-10-06 16:03:56

0

这里的权宜之计是:

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

变化:

  • 将构建(.*)将只是一味匹配的一切,从工作停止你的正则表达式,所以我把它换成那些实例完全具有更严格的匹配:
    1. ... comment(.*)? ... – thi基本上,它将全部或全部匹配。我换成这跟自认为[^"]*将匹配零个或多个非"字符(基本上,它会匹配到class属性的收盘"字符。
    2. ... >)(.*)<\/p> ... –再次,这将匹配太我已经用一个有效的模式代替它,它将匹配所有非<字符,一旦它遇到<它将检查它是否跟着</p>。如果是,它将停止匹配(因为我们在<p>标签结束),否则会继续。
  • 我删除了m因为它在这个正则表达式中没有用处。

它不会是可靠的(想象<p class="comment">...<p>...</p></p>;它将匹配<p class="comment">...<p>...</p>)。为了使其可靠,您需要使用递归正则表达式或(甚至更好)HTML解析器(或者XML,如果它是您处理的XHTML的话)。甚至有可以处理格式错误的HTML的库“正确”如果我读simplehtmldom主页上的示例代码正确 你可以做这样的事情