2012-03-21 174 views
3

在我的PHP代码,我有类名字符串中指定的命名空间,例如:使preg_split反斜杠

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

我在我的情况下,只需要中间名,“BBB”。我试图用这个:

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

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

回答

12

你想在你的正则表达式中有一个文字反斜杠,所以你必须逃避它。但然后你也想把它放在一个PHP string里面,这意味着你必须再次逃避它。

序列\\\/被分解成

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

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

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

+0

谢谢,现在有道理。并再次感谢提示,这里爆炸就足够了。 – 2012-03-21 22:12:11

0

我认为它的,因为你需要为字符串和一个正则表达式引擎逃脱一次

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 
)