5

我需要用&这样的字符串替换所有 & :

Übung 1: Ü & Ä

或在 html

Übung 1: Ü & Ä

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

搜索&它要么跟随(空格),要么不跟随一些字符,不包括以 . 结尾的空格;。然后将其替换为&.

我试过这样的事情:

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

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

对不起,我真的不明白正则表达式的东西。

4

4 回答 4

9

现有尝试的问题

您尝试的模式&[ ]|[^(?*^( ));]失败的原因主要是因为您有一个|但没有边界容器 - 这意味着您正在替换&[ ]OR [^(?*^( ));]- 后者将匹配大多数事物 - 您还误解了字符类的工作方式。

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

  • 如果它以 a开头^,则为否定,否则^为字面量。
  • 如果有连字符,则将其视为一个范围(例如 az 或 1-5 )
  • 如果有反斜杠,它要么标记一个速记类(例如\w),要么转义后面的字符(在 char 类中,这仅对 是必需的[ ] ^ - \)。
  • 您只匹配一个字符(受任何限定符);类内没有排序/序列,并且相同字符的重复被忽略。

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

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

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

解决方案

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

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

也就是说,一个&符号,后跟一个负前瞻:

  • 一个字母,然后是字母或数字,分号 - 即命名实体引用

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

要在 CFML 中使用它,替换&&amp;

<cfset data = rereplaceNoCase( data , '&(?![a-z][a-z0-9]+;|##(?:\d+|x[\dA-F]+);)' , '&amp;' , 'all' ) />
于 2013-01-04T13:27:33.377 回答
3

我认为简单地替换所有出现的&with会更容易&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 中发挥作用。

于 2013-01-04T09:18:33.897 回答
0

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

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

<cfset html = "&Uuml;bung 1: &Uuml; & &Auml;">
<cfset parsedHtml = REPLACE(html," & ", " &amp; ","All")>
于 2013-01-04T12:40:09.473 回答
-1

对于性能和免费问题,只需像这样使用十进制代码点......

<cfset html = Replace(html, Chr(38), "&amp;", "all")>
于 2018-04-15T17:24:09.213 回答