Regex для исключения некоторых символов из класса, но расширения за счет других, не включенных ⇐ Php

Кемеровские программисты php общаются здесь
Anonymous
Regex для исключения некоторых символов из класса, но расширения за счет других, не включенных

Сообщение Anonymous »

Я пытаюсь написать RegEx для генерации случайных строк типа [:graph:], но исключаю некоторые определенные символы, содержащиеся в строке $blacklist (например, некоторые символы могут отсутствовать на клавиатурах определенных языков, и не обязательно все знают коды ASCII или Unicode для их создания), но могут включать в строку $whitelist и другие символы, например пробелы.
Этот код позволяет удалять символы, не принадлежащие [:graph: ] и корректно работает в PHP:

Код: Выделить всё

$secure_password = substr(preg_replace('`[^[:graph:]]+`s', "", random_bytes($length * 10)), 0, $length);
Благодаря regex101.com я понял, как расширить шаблон, исключив любые дополнительные символы, а именно что-то вроде этого:

Код: Выделить всё

#(?:[^[:graph:]]+|[~`]+)#
Хотя в приведенном выше примере символы «~`» содержатся в классе [:graph:], они входят в число тех, которые будут удалены. Я понимаю, что нам нужно будет использовать функцию preg_quote для экранирования разделителей регулярных выражений.
В этом другом коде я попытался расширить набор удаляемых символов:

Код: Выделить всё

$pattern = (empty($blacklist))
? "[^[:graph:]]+"
: "(?:[^[:graph:]]+|[".preg_quote($blacklist, '`')."]+)";

$secure_password = substr(preg_replace($pattern, "", random_bytes($length * 10)), 0, $length);
Но это не работает.
Может кто-нибудь мне помочь? Спасибо.

Подробнее здесь: https://stackoverflow.com/questions/782 ... ot-include

Вернуться в «Php»