preg_split от обратной косой черты - PullRequest
3 голосов
/ 22 марта 2012

В моем 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 голосов
/ 22 марта 2012

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

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

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

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

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

1 голос
/ 22 марта 2012
$str = "aa\\bb\\cc";
print_r(preg_split("/\\\\/", $str));

выходы:

Array
(
    [0] => aa
    [1] => bb
    [2] => cc
)
1 голос
/ 22 марта 2012

Это немного странно, но вы должны избежать побегов, так как регулярное выражение анализируется дважды ...

попробовать:

$result_array = preg_split("/\\\\/", $my_class_name);
0 голосов
/ 22 марта 2012

Я думаю, это потому, что вам нужно один раз сбежать для строки и один для механизма регулярных выражений

...