preg_split от обратной косой черты

В моем 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 ответа

Решение

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

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

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

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

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

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

выходы:

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

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

пытаться:

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

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

Другие вопросы по тегам