5

&次のような文字列ですべての&をに置き換える必要があります。

Übung 1: Ü & Ä

またはhtmlで

Übung 1: Ü & Ä

文字列にhtmlspecialcharsが含まれているように(ただし、&はとして表示されません&)、置換から除外する必要があります。私は正規表現にあまり詳しくありません。必要なのは、次のことを行う式だけです。

その検索は&(スペース)の後に続くか、またはで終わるスペースを除いて、いくつかの文字の後に続きません;。次に、それを。に置き換え&ます。

私はこのようなことを試みました:

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

しかし、それはすべての文字を$ampに置き換えます;... ^^ '

申し訳ありませんが、私は本当にその正規表現を取得していません。

4

4 に答える 4

9

既存の試みに問題がある

試行したパターン&[ ]|[^(?*^( ));]が失敗する理由は、主に境界コンテナがありますが、境界コンテナがないためです。これは、 OR|を置き換えていることを意味し、後者はほとんどのものと一致します。また、文字クラスがどのように機能するかについて誤解しています。&[ ][^(?*^( ));]

[.. ](文字クラス)の中には、いくつかの簡単なルールがあります。

  • それがaで始まる場合、^それは否定されます。そうでない場合、^はリテラルです。
  • ハイフンがある場合は、範囲として扱われます(たとえば、azまたは1-5)。
  • バックスラッシュがある場合は、省略形のクラス(eg \w)をマークするか、次の文字をエスケープします(charクラス内ではこれはにのみ必要です[ ] ^ - \)。
  • 一致するのは1文字のみです(修飾子が必要です)。クラス内には順序/シーケンスはなく、同じ文字の重複は無視されます。

また、文字クラス内にスペースを入れる必要はありません。リテラルスペースは正常に機能します(明示的に有効にする必要があるフリースペースコメントモードでない限り)。

うまくいけば、それが何が悪かったのかを理解するのに役立ちますか?

実際にあなたの問題を解決することに関しては...

解決

HTMLエンティティを開始しないアンパサンドを照合するには、次を使用できます。

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

つまり、アンパサンドの後に、次のいずれかの負の先読みが続きます。

  • 文字、次に文字または数字、セミコロン-つまり名前付きエンティティ参照

  • ハッシュ、次に数値、またはxの後に16進数、最後にセミコロン-つまり数値エンティティ参照。

これをCFMLで使用するには、次のように置き換え&ます&amp;

<cfset data = rereplaceNoCase( data , '&(?![a-z][a-z0-9]+;|##(?:\d+|x[\dA-F]+);)' , '&amp;' , 'all' ) />
于 2013-01-04T13:27:33.377 に答える
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でもそのトリックを実行すると思います。

于 2013-01-04T09:18:33.897 に答える
0

あなたが持っている他のオプションは、REGEXをまったく使用しないことです。リストしたサンプル文字列の場合、htmlエンティティに影響を与えることなく、htmlアンパサンド( "&")を置き換えるだけです。これは、REPLACEを使用するだけで実行できます。

エンティティを使用する場合、アンパサンド文字の周囲にはスペースがないことに注意してください。アンパサンド文字をHTMLエンティティに変換する場合、通常、先頭と末尾にスペースがあります。REPLACEは、「&Uuml」文字列に影響を与えることなく、「&」のすべてのケースを検出して更新します(たとえば、先頭と末尾のスペースはありません)。

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

パフォーマンスと問題を解決するには、次のような10進コードポイントを使用してください...

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