Regex, php и \\

Рейтинг: 0Ответов: 1Опубликовано: 14.08.2023
<?php
function no_slashes($str){
    $pattern = "/[\\]/i";
    $replacement = '';
    $str=preg_replace($pattern, $replacement, $str);
    return $str;
}
echo no_slashes("\\");

Этот код должен убирать слеши, но выводится ошибка Warning: preg_replace(): Compilation failed: missing terminating ] for character class at offset 3 in C:\localhost\file.php on line 5. Что не так с кодом?

Ответы

▲ 1

Штука в том, что обратный слэш имеет особое значение в php и особое значение в регулярках.

Запустите интерактивный пхп (из консоли php -a) и введите:

echo  "\\";

Как видите пхп вывел только один слэш. Дело в том, что слэш в этом контексте это экранирующий символ и чтобы он не был экранирующим символом, надо его экранировать :-)

В регулярке слэш тоже экранирующий символ и вы совершенно справедливо написали \\. Но только \\ превратится \ во время парсинга строки и в функцию preg_replace попадёт /[\]/i (то есть экранированная скобка). Чтобы этого избежать надо экранировать оба слэша: /[\\\\]/i.

Попробуйте в консоли

echo "/[\\\\]/i";

Обратите внимание, что для простой замены символа (или набора символов) можно использовать и другие функции php: str_replace, substr_replace, strtr.

А если вы всё-таки хотите использовать регулярки, то тут вам не нужен символьный класс (квадратные скобки) и нечувствительность к регистру (i), можно просто написать /\\\\/.