У меня есть необходимость определить, является ли регулярное выражение действительным, так что недействительные могут быть изящно отвергнуты в пользовательском интерфейсе. При переполнении стека есть a clever abomination, чтобы сделать это с помощью другого регулярного выражения, которое я планирую усиленно избегать.Можно ли пропустить ошибки разделителя в preg/PHP regexp программно?
Существует гораздо более простой подход running a match and checking for errors, который возвращает правильный логический результат, но интересно было бы получить отказ причину/сообщение, а также:
// The error is that preg delimiters are missing
$testRegex = 'Location: (.+)';
// This bit is fine
$result = preg_match($testRegex, ''); // returns false i.e. failure
$valid = is_int($result); // false, i.e. the regex is invalid
// Returns PREG_NO_ERROR, which means no error occured
echo preg_last_error() . "\n";
Если я запускаю это я правильно получить:
PHP Warning: preg_match(): разделительный не должно быть алфавитно-цифровой или обратной косой черты в ... на линии ...
Однако выход функции ошибки равен 0
, что равно PREG_NO_ERROR
. Я бы подумал, что это вернет ненулевой код ошибки - и было бы еще лучше, если я смогу получить чистую версию предупреждающего сообщения.
Возможно, что это вообще не доступно (т. Е. Доступно только для механизма PHP для печати предупреждения). Я бегу 5.5.3-1ubuntu2.6 (cli)
.
Создайте свой собственный обработчик ошибок, будет ли это вариант? – Rizier123
Я полагаю, что 'preg_last_error' ничего не возвращает, потому что в этом конкретном случае шаблон регулярных выражений даже не попал в механизм PCRE. Разделители шаблонов заданы PHP, и сам PCRE их не ожидает. PHP удаляет разделители из шаблона и передает * это * в PCRE. Попробуйте использовать недопустимый шаблон, но с разделителями, и посмотрите, возвращает ли 'preg_last_error' что-то значимое. –
@ Лукас, спасибо - это похоже на точный обзор того, что происходит. – halfer