我已经编写了一个内容管理系统,它使用服务器端正则表达式在页面响应被发送到客户机浏览器之前,对其进行转义。正则表达式注意到已经转义或是HTML实体的一部分的符号。例如,以下内容:
a & b, c & d, © 2009
更改为:
a & b, c & d, © 2009
(只有第一个
&
这是从Rails帮助程序获取和修改的正则表达式:
html.gsub(/&(?!([a-zA-Z][a-zA-Z0-9]*|(#\d+));)/) { |special| ERB::Util::HTML_ESCAPE[special] }
虽然这很管用,但确实有问题。正则表达式不知道
或
]]>
这可能是围绕着未被俘获的符号。这是嵌入式JavaScript保持原样所必需的。例如,这:
//
if (a && b) doSomething();
// ]]>
不幸的是,呈现为:
//
if (a && b) doSomething();
// ]]>
哪些JavaScript引擎当然不理解。
我的问题是:是否有一种方法可以修改正则表达式,使其完全按照现在的方式执行,除非它使CDATA节中的文本保持不变?
由于正则表达式开头不那么简单,所以这个问题可能更容易回答:是否可以编写一个正则表达式,将除a'之间的字母以外的所有字母都改为句点?
<
“A”
>
“?例如,一个会改变的
"some are < safe! >"
进入之内
".... ... < safe! >"
?