我有字符串var:
Some text...<div class=example><pre><ul><li>Item</li></ul></pre><div class=showExample></div></div>Some text...
我想替换所有&lt;和&gt; pre标记中的字符转换为html实体= <
和>
所以我写了这个脚本:
text = text.replace(new RegExp("(?=(<pre>.*))<(?=(.*</pre>))","ig"),"<");
text = text.replace(new RegExp("(?=(<pre>.*))>(?=(.*</pre>))","ig"),">");
我总是得到这个结果:
<p>Some text...<div class=example><pre><ul><li>Item</li></ul></pre><div class=showExample></div></div>Some text...</p>
为什么???
答案 0 :(得分:1)
这是因为你的第一个前瞻:(?=(<pre>.*))
。当正则表达式的光标位于<pre>
之前时,它会匹配,因为您有<
并且前面有<pre>
。
您可能打算在那里使用(?<= ... )
,但javascript不支持它们。
我不熟悉JS,但首先在<pre>
标签中提取内容可能更容易:
match = text.match(/<pre>(.*?)<\/pre>/)[1];
然后在这个小组中替换你需要替换的所有内容:
match = match.replace(/</g, '<').replace(/>/g, '>');
然后将其替换回原始版本:
text = text.replace(/<pre>.*?<\/pre>/g, '<pre>'+match+'</pre>');
如前所述,我不熟悉JS,但我想你可以运行一个循环来替换那些<pre>
标签中的多个文本。
对于您的示例,这是fiddle。
答案 1 :(得分:-1)
也许你最好使用jQuery进行html编码/解码,然后使用Regex,因为它会破坏更复杂的标记。
您有示例here。