我编写了一个内容管理系统,它使用服务器端正则表达式在页面响应发送到客户端浏览器之前对页面响应中的&符号进行转义。正则表达式会注意已转义的或属于 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] }
虽然这很有效,但它确实有一个问题。正则表达式不知道任何<![CDATA[
or ]]>
这可能围绕着未转义的 & 符号。这对于嵌入式 JavaScript 保持不变是必要的。例如,这个:
<script type="text/javascript">
// <![CDATA[
if (a && b) doSomething();
// ]]>
</script>
不幸的是呈现为这样:
<script type="text/javascript">
// <![CDATA[
if (a && b) doSomething();
// ]]>
</script>
JavaScript 引擎当然无法理解。
我的问题是:有没有办法修改正则表达式,使其完全按照现在的方式执行,但它会使 CDATA 部分内的文本保持不变?
由于正则表达式一开始就不是那么简单,所以这个问题可能更容易回答:是否可以编写一个正则表达式,将除 ' 之间的字母之外的所有字母更改为句点<
'和一个'>
'?例如,一个会改变的"some <words> are < safe! >"
into ".... <words> ... < safe! >"
?