0

「HTMLに正規表現を使用しないでください」ということは知っていますが、真剣に、htmlパーサー全体をロードすることは常にオプションではありません。

というわけでシナリオはこちら

<script...>
    some stuff
</script>

<script...>
    var stuff = '<';
    anchortext
</script>

これを行う場合:

<script[^>]*?>.*?anchor.*?</script>

最初の script タグから 2 番目のブロックの /script までをキャプチャします。.* を実行する方法はありますか? しかし、を置き換えることによって。次のようなマッチブロックを使用します。

<script[^>]*?>(^</script>)*?anchor.*?</script>

否定的な先読みなどを見ましたが、何かがうまく動作しません。通常は [^>]*? を使用します。ただし、この特定の例では、スクリプトのコンテンツに「<」が含まれており、アンカーテキストに到達する前に一致を停止します。

簡単にするために、[^z]*? のようなものが必要です。ただし、単一の文字または文字範囲の代わりに、文字列に適合するキャプチャ グループが必要です。

.*?(?!z) doesn't have the same effect as [^z]*? as I assumed it would.

これが私が立ち往生している場所です:http://regexr.com?34llp

4

2 に答える 2

3

Match-anything-but は実際、一般的に否定先読みで実装されます。

 ((?!exclude).)*?

コツは、.ドットを繰り返さないことです。ただし、その文字が除外された単語の先頭にならないようにしながら、任意の文字に連続して一致させます。

あなたの場合、イニシャルの代わりにこれを持ちたいと思うでしょう.*?

 <script[^>]*?>((?!</script>).)*?anchor.*?</script>
于 2013-04-24T19:30:34.617 に答える
0

そのように:

$pattern = '~<script[^>]*+>((?:[^<]+?|<++(?!/script>))*?\banchor(?:[^<]+?|<++(?!/script>))*+)</script>~';

しかし、DOM はそれを行うためのより良い方法です。

于 2013-04-24T19:46:13.037 に答える