0

私はコミュニティーが私に助けを与えたと思ったthis problem大文字と小文字を区別しないRegExpですが、間違っています。次のRegExはIE7とIE8でどうなりますか?このJS RegExはIE7とIE8では失敗しますが、IE9では失敗します。

var reggy = /(\s*?)<span\b(?:.*?)(?:class=(?:'|"|.*?\s)?foobar(?:\s|\3))(?:.*?)(?:\/)?>(.+?)<\/span>(\s*?)/ig; 

jsFiddle here。 IE7とIE8だけで「一致しない」という結果が出ます。

+0

「(?:)」 – zzzzBov

+0

あなたは何をしようとしていますか?たぶん、正規表現はこれに最適な解決策ではありません。 http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – tvanfosson

+0

これはばかげた正規表現のように見えますが、すべてを複雑にすることには意味がありませんこれを手続き的に行うべきです。 正規表現を使用してhtmlを識別しようとしているようですが、これは_wrong_です。http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html – GAgnew

答えて

2

正規表現にはいくつかの問題があります。その中で最も悪いのは、キャプチャするグループとキャプチャしていないグループが混在しているようです。 Mike Samuelが暗唱したように、第3の捕捉グループは最後に(\s*?)である(これは最初のものと同様に、有用な目的を果たさなかった)。この正規表現を試してください:

/<span\b[^>]*\bclass=\s*(['"]?)forbes_entity\1[^>]*>[\s\S]*?<\/span>/ig 

ここには1つのキャプチャグループしかありません。一重引用符、二重引用符、または何も取得しません。クラス名の後、\1は再び同じものと一致します。 (fiddleのサンプルテキストと一致するようにクラス名を変更しました)

他のグループは必要ありませんでしたが、必要ならば非キャプチャグループ((?:...))を使用しましたキャプチャグループ番号を把握しやすくします。また、改行が含まれている場合には、.の代わりに[\s\S]を使用してスパンの内容を照合しました。

+0

アドバイスをいただきありがとうございます。キャプチャしているグループの数が少ない場合や、キャプチャしたグループの数に制限があるように見える場合は、興味深い点が1つあります。いくつかの制限がある場合これは特に真実です。 – buley

1

\3は、3番目のキャプチャグループがそれに続くので、空の文字列以外のものと決して一致しないため、疑わしいように見えます。 IEは、第3のキャプチャグループの前に、\3を8進エスケープとして扱うことができますか?つまり、\u0003と同等ですか?

IEの古いバージョンでは、\sは非標準的な意味を持っていました。たとえば、\u00A0と一致しませんでした。

+0

これは前方参照であるため、古いIEがエラーとして扱っている可能性があります。ECMAScript標準では、参照するグループがまだマッチに参加していないため、 –

+1

@AlanMoore、私は、仕様にはグループの初期値が空白で、繰り返しの入力があるたびにリセットされると書かれていたと思ったが、同じ結論に達していると思う。 –

関連する問題