7

別のユーザーの質問に対する回答をテストしているときに、理解できないものを見つけました。\t \n \r問題は、文字列のすべてのリテラル文字を単一のスペースに置き換えることでした。

さて、私が最初に試したパターンは次のとおりです。

/(?:\\[trn])+/

驚くほどうまくいきませんでした。Perl で同じパターンを試したところ、うまくいきました。試行錯誤の結果、次のように、パターンに一致させるために PHP が 3 つまたは 4 つのバックスラッシュを必要としていることがわかりました。

/(?:\\\\[trn])+/

また

/(?:\\\[trn])+/

これらのパターン - 驚いたことに - 両方とも機能します。これらの余分なバックスラッシュが必要なのはなぜですか?

4

4 に答える 4

12

次の理由により、正規表現で 1 を表すには 4 つのバックスラッシュが必要です。

  • 2 つのバックスラッシュは、文字列のエスケープ解除に使用されます ( "\\\\" -> \\)
  • 1 つのバックスラッシュは、正規表現エンジンでのエスケープ解除に使用されます ( \\ -> \)

PHPドキュメントから、

他の文字をエスケープすると、バックスラッシュも出力されます1

したがって\\\[

  • 1 つのバックスラッシュは のエスケープを解除するために使用され\、1 つの滞在\[は無効であるため ( "\\\[" -> \\[)
  • 1 つのバックスラッシュは、正規表現エンジンでのエスケープ解除に使用されます ( \\[ -> \[)

はい、機能しますが、良い習慣ではありません。

于 2010-01-27T09:51:01.747 に答える
8

正規表現パターンとして直接渡すため、perlで機能します/(?:\\[trn])+/

ただし、php では文字列として渡す必要があるため、バックスラッシュ自体に追加のエスケープが必要です。

"/(?:\\\\[trn])+/"

単一のバックスラッシュに一致する正規表現 \ は、 PHP preg 文字列として '/\\\\/' になり ます。

于 2010-01-27T09:53:54.183 に答える
2

正規表現ただ/(?:\\[trn])+/. ただし、文字列宣言でもバックスラッシュをエスケープする必要があるため、各バックスラッシュは次のように表現する必要があります\\

"/(?:\\\\[trn])+/"
'/(?:\\\\[trn])+/'

PHP はエスケープ シーケンス\[を認識せず、無視するため、3 つのバックスペースだけでも機能します。そう\\なります\が、\[とどまり\[ます。

于 2010-01-27T09:51:41.080 に答える
-2

str_replace を使用してください!

$code = str_replace(array("\t","\n","\r"),'',$code);

トリックを行う必要があります

于 2010-01-27T09:58:35.257 に答える