0

私は文字列変数を持っています:

Some text...<div class=example><pre><ul><li>Item</li></ul></pre><div class=showExample></div></div>Some text...

&lt;前タグのすべての < および > 文字を html entity =に置き換えたいので、&gt; このスクリプトを書きました:

text = text.replace(new RegExp("(?=(<pre>.*))<(?=(.*</pre>))","ig"),"&lt;");
text = text.replace(new RegExp("(?=(<pre>.*))>(?=(.*</pre>))","ig"),"&gt;");

私はいつもこの結果を得ます:

<p>Some text...<div class=example>&lt;pre><ul><li>Item</li></ul></pre><div class=showExample></div></div>Some text...</p>

どうして???

4

2 に答える 2

1

これは、最初の先読みが原因です: (?=(<pre>.*))。正規表現のカーソルが の直前にある場合は、があり、先<pre>にあるので一致します。<<pre>

代わりに後読みをするつもりだったのかもしれ(?<= ... )ませんが、javascript はそれらをサポートしていません。

私は JS に詳しくありませんが、最初に<pre>タグ内のものを抽出する方が簡単かもしれません:

match = text.match(/<pre>(.*?)<\/pre>/)[1];

次に、この小さなグループで置き換える必要があるすべてを置き換えます。

match = match.replace(/</g, '&lt;').replace(/>/g, '&gt;');

次に、元に戻します。

text = text.replace(/<pre>.*?<\/pre>/g, '<pre>'+match+'</pre>');

前に言ったように、私は JS に詳しくありませんが、ループを実行してこれらの<pre>タグ内の複数のテキストを置き換えることができると思います。

あなたの例では、ここに a fiddleがあります。

于 2013-08-10T13:23:50.820 に答える
-1

おそらく、jQuery を使用して html エンコード/デコードしてから、Regex を使用するほうがよいでしょう。より複雑なマークアップでは壊れてしまうからです。

ここに例があります。

于 2013-08-10T13:56:01.293 に答える