Coldfusion ReReplace"&"但不是htmlspecialchars

Tob*_*oby 4 regex coldfusion replace htmlspecialchars

我需要&在这样的字符串中替换all和with :

Übung 1: Ü & Ä
Run Code Online (Sandbox Code Playgroud)

或者在HTML中

Übung 1: Ü & Ä
Run Code Online (Sandbox Code Playgroud)

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

搜索&它可以跟随 (space) or does not follow some chars, excluding a space, which are ending with a ;.然后替换它&.

我试过这样的事情:

<cfset data = ReReplace(data, "&[ ]|[^(?*^( ));]", "&amp;", "ALL") />
Run Code Online (Sandbox Code Playgroud)

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

对不起,我真的没有得到那个正则表达式的东西.

Pet*_*ton 8

现有尝试存在问题

你的尝试模式&[ ]|[^(?*^( ));]失败的原因主要是因为你有一个|但没有绑定容器 - 这意味着你正在替换&[ ]OR [^(?*^( ));]- 而后者将匹配大多数东西 - 你也误解了字符类的工作方式.

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

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

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

希望这可以帮助您了解出了什么问题?

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

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

&(?![a-z][a-z0-9]+;|#(?:\d+|x[\dA-F]+);)
Run Code Online (Sandbox Code Playgroud)

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

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

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

要在CFML使用,以取代&&amp;将是:

<cfset data = rereplaceNoCase( data , '&(?![a-z][a-z0-9]+;|##(?:\d+|x[\dA-F]+);)' , '&amp;' , 'all' ) />
Run Code Online (Sandbox Code Playgroud)