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);

但是,它不起作用。我需要在正则表达式中使用三重反斜杠"/\\\/"才能使其工作。我的问题是:为什么我需要其中三个?我总是通过加倍来逃避反斜杠特殊功能。

4

4 回答 4

12

你想在你的正则表达式中有一个文字反斜杠,所以你必须转义它。但是你也想把它放在一个 PHP字符串中,这意味着你必须再次转义它

序列\\\/被分解为

  • \\一个文字反斜杠字符)和
  • \/(反斜杠后跟斜杠;根据 PHP 字符串转义规则,这不是有效的转义序列,因此被识别为对或字符文字\/

四个反斜杠也将被转换为两个反斜杠字符,因此将模式指定为字符串文字"/\\\\/"等同于将其指定为"/\\\/".

但是你为什么要使用preg_split而不是explode('\\', $my_class_name)

于 2012-03-21T21:54:16.090 回答
1

它有点奇怪,但你必须逃避转义,因为正则表达式被解析两次......

尝试:

$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

我认为这是因为您需要为字符串转义一次,为正则表达式引擎转义一次

于 2012-03-21T21:54:47.323 回答