0

我有字符串变量:

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

我想将 pre 标记中的所有 < 和 > 字符替换为 html entity =&lt;所以&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>时,它匹配,因为你有 a<并且<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>标签中的多个文本。

对于您的示例,这是一个fiddle

于 2013-08-10T13:23:50.820 回答
-1

也许您最好使用 jQuery 进行 html 编码/解码,然后使用 Regex,因为它会破坏更复杂的标记。

你在这里有例子。

于 2013-08-10T13:56:01.293 回答