javascript中的正则表达式和replace方法

时间:2013-08-10 13:06:48

标签: javascript html regex

我有字符串var:

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

我想替换所有&lt;和&gt; pre标记中的字符转换为html实体= &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>

为什么???

2 个答案:

答案 0 :(得分: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>标签中的多个文本。

对于您的示例,这是fiddle

答案 1 :(得分:-1)

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

您有示例here