小编Nic*_*ick的帖子

正则表达式在尊重CDATA时转义HTML&符号

我编写了一个内容管理系统,该系统使用服务器端正则表达式在页面响应中将&符号转发到客户端的浏览器之前.正则表达式注意到已经被转义或是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] }
Run Code Online (Sandbox Code Playgroud)

虽然这很好用但确实有问题.正则表达式不知道任何<![CDATA[]]>可能围绕未转义的&符号.这对于嵌入式JavaScript保持不变是必要的.例如,这个:

<script type="text/javascript">
  // <![CDATA[
  if (a && b) doSomething();
  // ]]>
</script>
Run Code Online (Sandbox Code Playgroud)

不幸的是这样呈现:

<script type="text/javascript">
  // <![CDATA[
  if (a &amp;&amp; b) doSomething();
  // ]]>
</script>
Run Code Online (Sandbox Code Playgroud)

这当然是JavaScript引擎无法理解的.

我的问题是:有没有办法修改正则表达式,就像现在一样,除了它保持CDATA部分内的文本不变?

由于正则表达式开头并不那么简单,因此这个问题可能更容易回答:是否可以编写一个正则表达式,将所有字母更改为除<'和' 之间的字母之外的句点>?例如,一个会"some <words> are < safe! >"变成".... <words> ... < safe! >"

ruby regex ruby-on-rails

8
推荐指数
1
解决办法
5824
查看次数

标签 统计

regex ×1

ruby ×1

ruby-on-rails ×1