在我的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反斜杠才能使其正常工作。我的问题是:为什么我需要三个呢?我总是通过加倍来逃避反斜杠特殊功能。
答案 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)
我认为是因为你需要为字符串转义一次,为正则表达式引擎转义一次