2012-03-21 16 views
3

В моем PHP код, у меня есть имя класса с пространством имен, назначенного в строке, например:preg_split по обратной косой черты

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

мне нужно только отчества, «БББ» в моем случае. Я попытался использовать это:

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

Однако, это не сработало. Мне нужно использовать тройную обратную косую черту в regexp "/\\\/", чтобы она работала. Мой вопрос: зачем мне три из них? Я всегда избегал специальной функции обратной косой черты, удваивая ее.

ответ

12

Вы хотите иметь обратную косую черту в своем регулярном выражении, чтобы вы могли избежать этого. Но , затем, вы также хотите поместить его в PHP string, а это значит, что вы должны снова сбежать от него.

Последовательность \\\/ получает разбита на

  • \\ (один буквальным обратной косой черты) и
  • \/ (обратной косой черты, за которым следует косой черты, в соответствии с PHP строку побега правил, который не является действительная последовательность эвакуации и, следовательно, распознается как пара или символьные литеры \/)

Four обратная косая черта также будет переведена на два символа обратной косой черты, поэтому указание шаблона в виде строкового литерала "/\\\\/" эквивалентно его определению как "/\\\/".

Но почему вы используете preg_split вместо explode('\\', $my_class_name)?

+0

Спасибо, теперь это имеет смысл. И еще раз спасибо за подсказку, достаточно взрыва. –

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 
) 
Смежные вопросы