36

好奇心から、次のように PHP の正規表現パターンで使用するためにバックスラッシュをエスケープする正しい方法を見つけようとしています。

テスト 01: (3 つのバックスラッシュ)

$pattern = "/^[\\\]{1,}$/";
$string = '\\';

// ----- RETURNS A MATCH -----

テスト 02: (バックスラッシュ 4 つ)

$pattern = "/^[\\\\]{1,}$/";
$string = '\\';

// ----- ALSO RETURNS A MATCH -----

以下の記事によると、おそらく 4 が正しい方法ですが、混乱しているのは、両方のテストで一致が返されたことです。両方が正しい場合、4 が望ましい方法ですか?

資力:

4

6 に答える 6

54
// PHP 5.4.1

// Either three or four \ can be used to match a '\'.
echo preg_match( '/\\\/', '\\' );        // 1
echo preg_match( '/\\\\/', '\\' );       // 1

// Match two backslashes `\\`.
echo preg_match( '/\\\\\\/', '\\\\' );   // Warning: No ending delimiter '/' found
echo preg_match( '/\\\\\\\/', '\\\\' );  // 1
echo preg_match( '/\\\\\\\\/', '\\\\' ); // 1

// Match one backslash using a character class.
echo preg_match( '/[\\]/', '\\' );       // 0
echo preg_match( '/[\\\]/', '\\' );      // 1  
echo preg_match( '/[\\\\]/', '\\' );     // 1

3 つのバックスラッシュを使用して a に一致させる場合'\'、以下のパターンは一致 a の'\'後に an が続くものとして解釈され's'ます。

echo preg_match( '/\\\\s/', '\\ ' );    // 0  
echo preg_match( '/\\\\s/', '\\s' );    // 1  

4 つのバックスラッシュを使用して a に一致させる場合'\'、以下のパターンは、一致する a の'\'後にスペース文字が続くものとして解釈されます。

echo preg_match( '/\\\\\s/', '\\ ' );   // 1
echo preg_match( '/\\\\\s/', '\\s' );   // 0

文字クラス内の場合も同様です。

echo preg_match( '/[\\\\s]/', ' ' );   // 0 
echo preg_match( '/[\\\\\s]/', ' ' );  // 1 

上記の結果は、文字列を一重引用符ではなく二重引用符で囲んでも影響を受けません。

結論:
括弧付き文字クラスの内部または外部に関係なく'\\\'、パターン内の次の文字もバックスラッシュでない限り、3 つのバックスラッシュを使用してリテラルのバックスラッシュを照合できます。その場合、リテラルのバックスラッシュは 4 つのバックスラッシュを使用して照合する必要があります。

推奨事項:バックスラッシュを照合する場合は、正規表現パターンで
常に 4 つのバックスラッシュを使用してください。'\\\\'

エスケープ シーケンス

于 2013-03-12T18:59:21.353 に答える
14

この種の不明瞭なコードを避けるために、\x5cを使用できます :)

echo preg_replace( '/\x5c\w+\.php$/i', '<b>${0}</b>', __FILE__ );
于 2014-07-30T19:33:22.787 に答える
4

問題は、文字クラスを使用している[]ため、リテラルのバックスラッシュがいくつ埋め込まれていても関係なく、単一のバックスラッシュとして扱われます。

たとえば、次の 2 つの正規表現:

/[a]/
/[aa]/

正規表現エンジンに関する限り、すべての意図と目的は同一です。文字クラスは、文字のリストを取得し、それらを「折りたたんで」単一の文字に一致させます。これは、「考慮されている現在の文字は、? 内にリストされている文字のいずれ[]かですか?」という行に沿って行われます。クラスに2つのバックスラッシュをリストすると、「文字はブラックスラッシュですか、それともバックスラッシュですか?」になります。

于 2012-06-15T03:16:31.163 に答える