2009-08-14 6 views
0

タグのコンテンツを特定のクラスで取得する必要があります。クラスはsimplecommentまたはcomment ...RegExの問題 - 指定されたクラスのタグのコンテンツを取得する - preg_match(_all)

だから私は、次のコード

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

を書いたことができ、それは何も返しません。しかし、タグ終了部分(<\/p>)を削除すると、何とかして、長すぎる文字列を(タグの開始から文書の最後まで)巻き戻します。

正規表現には何が問題はありますか?

答えて

2

http://simplehtmldom.sourceforge.net/

のようなDOMパーサを使用してみてください(ブラウザがやるように。):

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

は、第三案をString Parsingの代わりに[DOM](http://php.net/manual/en/book.dom.php)を実際に使用する[SimpleHtmlDom](http://simplehtmldom.sourceforge.net/)に代わって[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

0

ここでクイックフィックスは以下の通りです:

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

変更:

  • 構造(.*)はただやみくもに取り組んでから、あなたの正規表現を停止し、すべてを、一致しますので、私はそれらを交換してきました完全一致の完全一致のインスタンス:
    1. ... comment(.*)? ... – thi基本的には、すべてまたは何も一致しません。私はそれがゼロ以上の非"文字にマッチしますので、– ... >)(.*)<\/p> ...
    2. 。(基本的に、それはclass属性の開閉"文字に一致します[^"]*でこれを置き換え、再び、これはあまりにもマッチします私はこれを効率的なパターンに置き換えました。それは<以外の文字と一致し、<に達すると、</p>が続くかどうかを確認します。 <p>タグの末尾)、それ以外の場合は続行します。
  • mこの正規表現では使用されていないため、フラグを立てます。

しかし<p class="comment">...<p>...</p></p>を想像し、それは<p class="comment">...<p>...</p>と一致します)信頼できないであろう。

信頼できるようにするには、再帰的な正規表現を使用するか、HTMLパーサー(扱うXHTMLの場合はXML)を使用する必要があります。不正な形式のHTML 「適切に」私が正しく あなたはこのような何か行うことができますsimplehtmldomのホームページ上の例のコードを読めば

関連する問題