2009-08-14 75 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主頁上的示例代碼正確 你可以做這樣的事情