3

私のPHPコードでは、文字列に名前空間が割り当てられたクラス名があります。次に例を示します。

$my_class_name; // = "Aaa\Bbb\Ccc"; // this is not in source code, just var dump

私の場合、ミドルネーム「Bbb」だけが必要です。私はこれを使用しようとしました:

$result_array = preg_split("/\\/", $my_class_name);

しかし、うまくいきません。それを機能させるには、正規表現でトリプルバックスラッシュを使用する必要があります"/\\\/"。私の質問は、なぜ 3 つ必要なのですか? バックスラッシュの特殊関数を2倍にすることで常にエスケープしてきました。

4

4 に答える 4

12

正規表現にリテラルのバックスラッシュを含める必要があるため、エスケープする必要があります。しかし、それを PHP のstring内にも置きたい場合は、もう一度エスケープする必要があります。

シーケンス\\\/は次のように分解されます

  • \\( 1 つのリテラル バックスラッシュ文字) および
  • \/(バックスラッシュの後にスラッシュが続きます。PHP 文字列のエスケープ規則に従って、これは有効なエスケープ シーケンスではないため、ペアまたは文字リテラルとして認識されます\/)

4 つのバックスラッシュも 2 つのバックスラッシュ文字に変換されるため、パターンを文字列リテラルとして"/\\\\/"指定することは、それを として指定することと同じ"/\\\/"です。

しかし、なぜpreg_split代わりに使用しているのexplode('\\', $my_class_name)ですか?

于 2012-03-21T21:54:16.090 に答える
1

少し奇妙ですが、正規表現が2回解析されるため、エスケープをエスケープする必要があります...

試す:

$result_array = preg_split("/\\\\/", $my_class_name);
于 2012-03-21T21:54:57.743 に答える
1
$str = "aa\\bb\\cc";
print_r(preg_split("/\\\\/", $str));

出力:

Array
(
    [0] => aa
    [1] => bb
    [2] => cc
)
于 2012-03-21T22:00:38.527 に答える
0

文字列用に1回、正規表現エンジン用に1回エスケープする必要があるためだと思います

于 2012-03-21T21:54:47.323 に答える