Coldfusion ReReplace“&”但不是htmlspecialchars

时间:2013-01-04 08:51:04

标签: regex coldfusion replace htmlspecialchars

我需要更换所有&与&一起使用如下字符串:

Übung 1: Ü & Ä

或在html中

Übung 1: Ü & Ä

就像你在字符串中看到htmlspecialchars一样(但&没有显示为&),所以我需要将它们从我的替换中排除。我对正则表达式并不熟悉。我需要的是一个表达式,它执行以下操作:

搜索&跟随(空格)或不跟随某些字符的;,不包括以&amp;结尾的空格。然后用<cfset data = ReReplace(data, "&[ ]|[^(?*^( ));]", "&amp;", "ALL") /> 替换它。

我试过这样的事情:

{{1}}

但是用$ amp替换每个字符; ... ^^'

对不起,我真的没有那个正则表达式。

4 个答案:

答案 0 :(得分:8)

现有尝试的问题

您尝试的模式&[ ]|[^(?*^( ));]失败的原因主要是因为您有|但没有绑定容器 - 这意味着您要替换&[ ][^(?*^( ));] - 并且后者将匹配大多数事情 - 你也误解了角色类的工作方式。

[ .. ](一个字符类)里面有一些简单的规则:

  • 如果^ 开始,则会被否定,否则^就是字面意思。
  • 如果有连字符,则将其视为范围(例如a-z或1-5)
  • 如果有反斜杠,它会标记一个速记类(例如\w),或者转义后续字符(在char类中,只有[ ] { {1}} ^ -)。
  • 你只匹配一个角色(受任何限定词限制);在类中没有排序/序列,并且忽略相同字符的重复。

此外,您不需要在字符类中放置空格 - 文字空间可以正常工作(除非您处于自由间距注释模式,需要明确启用)。

希望这有助于您了解出现了什么问题?

至于实际解决你的问题......

解决方案

要匹配不启动HTML实体的&符号,您可以使用:

\

也就是说,一个&符号,然后是以下任何一个的负前瞻:

  • 一封信,一封信或一个数字,一个分号 - 即一个命名的实体参考

  • 一个哈希,然后是一个数字,或者一个x后跟一个十六进制数,最后是一个分号 - 即一个数字实体引用。

要在CFML中使用此功能,将&(?![a-z][a-z0-9]+;|#(?:\d+|x[\dA-F]+);) 替换为&将是:

&amp;

答案 1 :(得分:3)

我认为用&简单地替换所有出现的&amp;会更容易,然后再次替换错误替换的那些

<cfset data = ReReplace(ReReplace(data, "&", "&amp;", "ALL"), "&amp;([^;&]*;)", "&\1", "ALL") />

我没有在ColdFusion中测试过这个(因为我不知道怎么做),但它应该可以工作,因为在JavaScript中,正则表达式本身有效:

var s = "I we&nt out on 1 se&123;p 2012 and& it was be&tter & than 15 jan 2012"
console.log(s.replace(/&/g, '&amp;').replace(/&amp;([^;&]*;)/g, '&$1'));
//"I we&amp;nt out on 1 se&123;p 2012 and&amp; it was be&amp;tter &amp; than 15 jan 2012"

所以我认为正则表达式也会在CF中发挥作用。

答案 2 :(得分:0)

您拥有的另一个选择是根本不使用REGEX。对于您列出的示例字符串,您只需要替换html&符号(“&amp;”),而不会影响html实体。 这可以使用REPLACE完成。

请记住,在使用实体时,&符号周围不会有空格,将&符号转换为HTML实体,通常有一个前导和尾随空格。 REPLACE将查找“&amp;”的每个案例并进行更新,而不会影响任何“&amp; Uuml”字符串(例如,没有前导和尾随空格)。

<cfset html = "&Uuml;bung 1: &Uuml; & &Auml;">
<cfset parsedHtml = REPLACE(html," & ", " &amp; ","All")>

答案 3 :(得分:-1)

表演&amp;问题免费,只需使用Decimal代码点......

Mono