当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《正则表达式在尊重CDATA时转义HTML&符号》经验,为你挑选了1个好方法。

我编写了一个内容管理系统,该系统使用服务器端正则表达式在页面响应中将&符号转发到客户端的浏览器之前.正则表达式注意到已经被转义或是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保持不变是必要的.例如,这个:


不幸的是这样呈现:


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

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

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



1> Alan Moore..:

你自找的!:d

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

第一行是你原来的正则表达式.如果]]>前面有一个CDATA结束序列(),则前瞻匹配,除非这里和那之间有一个开放序列().假设文档格式最小,那应该意味着当前位置在CDATA部分内.

哎呀,我倒退了:通过使用正向前瞻我只在CDATA部分匹配"裸"&符号.我将它改为负向前瞻,所以现在它正常工作.

顺便说一下,这个正则表达式在Ruby模式下的RegexBuddy中工作,但不在rubular站点上工作.我怀疑Rubular使用旧版本的Ruby,并且支持不太强大的正则表达式; 任何人都可以确认吗?(您可能已经猜到了,我不是Ruby程序员.)

编辑:Rubular的问题是我使用's'作为修饰符(表示点匹配 - 所有内容),但Ruby使用'm'表示.

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有