Используйте preg_quote, но сохраняйте определенные символы регулярного выражения - PullRequest
0 голосов
/ 09 марта 2019

Функция preg_quote позволяет указать дополнительный разделитель для экранирования. Но для целей замены есть ли альтернатива, чтобы также указывать разделители , а не для экранирования?

Например, я хочу экранировать все (включая дополнительный разделитель "/"), кроме "*" и "\".

Вроде как:

$str = 'Replace/this line $15 #1 except \w* {';
$str = preg_quote_except($str, '/', '\*');
// Should be identical to:
$str = 'Replace\/this line \$15 \#1 except \w* \{';

Обновление

Хотя я ценю ваши попытки пометить это как дубликат всего через несколько секунд после того, как его спросили, на самом деле это не дубликат Как экранировать только определенные символы . Там пользователь хочет только определенные символов, а я хочу все, кроме некоторых. Я не хочу вручную управлять тем, что нужно экранировать (кстати, помните, PHP время от времени добавляет новые символы для экранирования).

1 Ответ

2 голосов
/ 09 марта 2019

Вы можете отменить нежелательные побеги.

$str = preg_quote($str, '/');
$str = str_replace(['\\*', '\\\\'], ['*', '\\'], $str);

Это может быть функция:

function preg_quote_except($str, $except, $delim = NULL) {
    $str = preg_quote($str, $delim);
    for ($i = 0; $i < strlen($except); $i++) {
        $from[] = '\\' . $except[$i];
        $to[] = $except[$i];
    }
    return str_replace($from, $to, $str);
}

Тогда вы бы назвали это как:

$str = preg_quote_except($str, '\\*', '/');

Я переместил параметр разделителя в конец, чтобы он мог быть необязательным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...