微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails – 正则表达式,以在尊重CDATA时转义HTML&符号

我编写了一个内容管理系统,该系统使用服务器端正则表达式在页面响应中将符号转发到客户端浏览器之前.正则表达式注意到已经被转义或属于 HTML实体的&符号.例如,以下内容
a & b,c & d,© 2009

改为:

a & b,© 2009

(只有第一个&被修改.)这是正则表达式,它是从Rails助手中获取修改的:

html.gsub(/&(?!([a-zA-Z][a-zA-Z0-9]*|(#\d+));)/) { |special| ERB::Util::HTML_ESCAPE[special] }

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

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

遗憾的是这样呈现:

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

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

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

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

解决方法

你自找的! :d
/&(?!(?:[a-zA-Z][a-zA-Z0-9]*|#\d+);)
 (?!(?>(?:(?!<!\[CDATA\[|\]\]>).)*)\]\]>)/xm

第一行是你原来的正则表达式.如果前面有一个CDATA结束序列(]]>),前瞻匹配,除非这里和那之间有一个开放序列(<!CDATA [).假设文档格式最小,那应该意味着当前位置在CDATA部分内. 哎呀,我倒退了:通过使用正向前瞻我只在CDATA部分匹配“裸”&符号.我将它改为负面的前瞻,所以现在它正常工作. 顺便说一句,这个正则表达式在Ruby模式下在RegexBuddy中工作,但在the rubular site时不行.我怀疑Rubular使用较旧版本的Ruby而不强大的正则表达式支持;任何人都可以证实吗? (您可能已经猜到了,我不是Ruby程序员.)

编辑:Rubular的问题是我使用’s’作为修饰符(意思是点匹配 – 一切),但Ruby使用’m’.

原文地址:https://www.jb51.cc/ruby/270825.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐