反斜杠preg_split

时间:2012-03-21 21:51:27

标签: php regex escaping backslash preg-split

在我的PHP代码中,我在字符串中指定了名称空间的类名,例如:

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

在我的情况下,我只需要中间名,'Bbb'。我试着用这个:

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

然而,它不起作用。我需要在regexp "/\\\/"中使用tripple反斜杠才能使其正常工作。我的问题是:为什么我需要三个呢?我总是通过加倍来逃避反斜杠特殊功能。

4 个答案:

答案 0 :(得分:12)

您希望在正则表达式中使用字面反斜杠,因此必须将其转义。但是然后你也想把它放在PHP string里面,这意味着你必须再次逃避它。

序列\\\/被分解为

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

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

但为什么使用preg_split代替explode('\\', $my_class_name)

答案 1 :(得分:1)

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

尝试:

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

答案 2 :(得分:1)

$str = "aa\\bb\\cc";
print_r(preg_split("/\\\\/", $str));

输出:

Array
(
    [0] => aa
    [1] => bb
    [2] => cc
)

答案 3 :(得分:0)

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