0

<p>指定されたクラスのタグのコンテンツを取得する必要があります。クラスは、simplecommentまたはcomment...

だから私は次のコードを書いた

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(.*)?... –基本的に、これはすべてまたはまったく一致しません。これを置き換えたのは[^"]*、0個以上の非"文字に一致するためです(基本的には、属性の終了"文字に一致します)。class
    2. ... >)(.*)<\/p>... –繰り返しますが、これは一致しすぎます。私はそれをすべての非<文字に一致する効率的なパターンに置き換えました、そしてそれがヒットする<と、それが後に続くかどうかをチェックし</p>ます。そうである場合は(タグの最後にあるため)一致を停止し<p>、そうでない場合は続行します。
  • mこの正規表現では使用されないため、フラグを削除しました。

しかし、それは信頼できません(想像してください<p class="comment">...<p>...</p></p>;それは一致します<p class="comment">...<p>...</p>)。

信頼性を高めるには、再帰的な正規表現または(さらに良い)HT​​MLパーサー(または、処理しているXHTMLの場合はXML)を使用する必要があります。不正な形式のHTMLを「適切に」処理できるライブラリもあります(ブラウザのように。)

于 2009-08-14T11:49:10.447 に答える