反斜杠作为preg_split的分隔符

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个回答

12
您想在正则表达式中使用一个反斜杠,因此必须对其进行转义。但是,您还希望将其放在 PHP string 中,这意味着您必须再次转义它。
序列 \\\/ 被分解为:
- \\(一个反斜杠字符)和 - \/(反斜杠后跟一个斜杠;根据 PHP 字符串转义规则,这不是有效的转义序列,因此被识别为一对字符文字\/
四个反斜杠也会被转换为两个反斜杠字符,因此将模式指定为字符串字面值"/\\\\/"等同于指定为"/\\\/"
但是,为什么要使用preg_split而不是explode('\\', $my_class_name)

谢谢,现在我明白了。再次感谢您的提示,explode在这里已经足够了。 - Pavel S.
对于我的同行子天才们,他的意思是如果你要使用preg_split,答案是/\\\\/。对于我的C#开发同行们,如果你正在寻找split,那么explode是PHP的等效函数。 - toddmo

1

这有点奇怪,但你必须转义转义字符,因为正则表达式会被解析两次...

尝试:

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

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

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

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接