2011-01-31 14 views
3

私はこのような文字列を持っています。正規表現の選択

<p class='link'>try</p>bla bla</p> 

は私だけ<p class='link'>try</p> 私はこれを試してみました取得したいです。
/<p class='link'>[^<\/p>]+<\/p>/

しかし、動作しません。

どうすればいいですか?あなたが<\/p>を追加しているので おかげで、

+1

正規表現とHTMLの? http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+0

確かに* can * [regexesでHTMLを解析できます](http://stackoverflow.com/question/4284176/perl-per-where-am-i-going-wrong/4286326#4286326)、それが一般的なHTMLの場合は、おそらくしたくないでしょう。しかし、 "キャプティブ" HTMLでも問題ありません。その「野生の」状態でそれを信じられないほど慎重にしてください。 – tchrist

答えて

4

それはあなたの文字列であり、そしてあなたがそれらのpタグの間のテキストをしたい場合は、これは動作するはずです...

/<p\sclass='link'>(.*?)<\/p>/ 

あなたが働いていない理由は、あなたのキャラクターの範囲ではありません。それは文字どおり一致していませんが、個々の文字を個別にチェックしません。もちろん

、私がHTMLの断片を解析するためのより良いツールがあることを言及必須である(例えばHTMLパーサとしては。)

+1

+1のHTMLパーサー –

+0

@マッティ - 合意しました!実際には、私は '/ \> [^ <>] * \ bHTML \ b [^ <>] * \ bParser \ b [^ <>] * \ Kobi

+1

これは非常に壊れやすいパターンです。 [参照してください](http://stackoverflow.com/questions/4284176/doubt-in-parsing-data-in-perl-where-am-i-going-wrong/4286326#4286326)あなたが本当に慎重にどのように慎重にジェネリックHTMLで正規表現を使うのは難しいですか? – tchrist

0
'/<p[^>]+>([^<]+)<\/p>/' 

あなたは

0

を「試す」を取得しますそれはあなたのように見えますこのブロックを使用しました:[^<\/p>]+</p>以外のものと一致するようにします。残念ながら、それはそうではありません。 A []ブロックは、内部の任意の文字と一致します。あなたの場合、/<p class='link'>[^<\/p>]+の部分は<p class='link'>try</と一致しましたが、直後には予期されていた</p>の後に一致しませんでした。

アレックスの解決策は、私がこの種の問題に近づく傾向がある方法です。

0

特定のタグにあまり特有のものを作らないようにしました。

(<[^/]+?\s+[^>]*>[^>]*>) 

これが返されます。

<p class='link'>try</p>

関連する問題