我需要更换所有&与&
一起使用如下字符串:
Übung 1: Ü & Ä
或在html中
Übung 1: Ü & Ä
就像你在字符串中看到htmlspecialchars一样(但&
没有显示为&
),所以我需要将它们从我的替换中排除。我对正则表达式并不熟悉。我需要的是一个表达式,它执行以下操作:
搜索&
跟随(空格)或不跟随某些字符的
;
,不包括以&
结尾的空格。然后用<cfset data = ReReplace(data, "&[ ]|[^(?*^( ));]", "&", "ALL") />
替换它。
我试过这样的事情:
{{1}}
但是用$ amp替换每个字符; ... ^^'
对不起,我真的没有那个正则表达式。
答案 0 :(得分:8)
您尝试的模式&[ ]|[^(?*^( ));]
失败的原因主要是因为您有|
但没有绑定容器 - 这意味着您要替换&[ ]
或[^(?*^( ));]
- 并且后者将匹配大多数事情 - 你也误解了角色类的工作方式。
在[
.. ]
(一个字符类)里面有一些简单的规则:
^
开始,则会被否定,否则^
就是字面意思。\w
),或者转义后续字符(在char类中,只有[
]
{ {1}} ^
-
)。此外,您不需要在字符类中放置空格 - 文字空间可以正常工作(除非您处于自由间距注释模式,需要明确启用)。
希望这有助于您了解出现了什么问题?
至于实际解决你的问题......
要匹配不启动HTML实体的&符号,您可以使用:
\
也就是说,一个&符号,然后是以下任何一个的负前瞻:
一封信,一封信或一个数字,一个分号 - 即一个命名的实体参考
一个哈希,然后是一个数字,或者一个x后跟一个十六进制数,最后是一个分号 - 即一个数字实体引用。
要在CFML中使用此功能,将&(?![a-z][a-z0-9]+;|#(?:\d+|x[\dA-F]+);)
替换为&
将是:
&
答案 1 :(得分:3)
我认为用&
简单地替换所有出现的&
会更容易,然后再次替换错误替换的那些
<cfset data = ReReplace(ReReplace(data, "&", "&", "ALL"), "&([^;&]*;)", "&\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, '&').replace(/&([^;&]*;)/g, '&$1'));
//"I we&nt out on 1 se&123;p 2012 and& it was be&tter & than 15 jan 2012"
所以我认为正则表达式也会在CF中发挥作用。
答案 2 :(得分:0)
您拥有的另一个选择是根本不使用REGEX。对于您列出的示例字符串,您只需要替换html&符号(“&amp;”),而不会影响html实体。 这可以使用REPLACE完成。
请记住,在使用实体时,&符号周围不会有空格,将&符号转换为HTML实体,通常有一个前导和尾随空格。 REPLACE将查找“&amp;”的每个案例并进行更新,而不会影响任何“&amp; Uuml”字符串(例如,没有前导和尾随空格)。
<cfset html = "Übung 1: Ü & Ä">
<cfset parsedHtml = REPLACE(html," & ", " & ","All")>
答案 3 :(得分:-1)
表演&amp;问题免费,只需使用Decimal代码点......
Mono