Мне нужно определить, допустимо ли регулярное выражение, чтобы недопустимые можно было корректно отклонить в пользовательском интерфейсе. В Stack Overflow есть умная мерзость делать это с другим регулярным выражением, чего я планирую всячески избегать.
Существует гораздо более простой подход выполнение сопоставления и проверка на наличие ошибок, который возвращает правильный логический результат, но это было бы интересно также получить причину/сообщение о сбое:
// 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: preg_match(): разделитель не должен быть буквенно-цифровым или обратной косой чертой в ... в строке ...
Однако выход функции ошибки равен 0
, что равно PREG_NO_ERROR
. Я бы подумал, что это вернет ненулевой код ошибки - и было бы еще лучше, если бы я мог получить чистую версию предупреждающего сообщения.
Конечно, возможно, что это не общедоступно (т.е. доступно только для механизма PHP для печати предупреждения). Я бегу 5.5.3-1ubuntu2.6 (cli)
.
preg_last_error
ничего не возвращает, потому что в этом конкретном случае шаблон регулярного выражения даже не попал в механизм PCRE. Разделители шаблонов обязательны для PHP, а сама PCRE их не ожидает. PHP удаляет разделители из шаблона и передает это в PCRE. Попробуйте использовать недопустимый шаблон, но с разделителями, и посмотрите, возвращает лиpreg_last_error
что-то осмысленное. - person Lucas Trzesniewski   schedule 02.05.2015regex
(без разделителей, отдельные поля ввода для флагов), затем объединить их в код и создать окончательную строку для передачиpreg_match()
и друзьям. Что-то вроде:'/'.preg_quote($_GET['regex']).'/'.$modifiers
. Посетите regex101.com для вдохновения. - person axiac   schedule 02.05.2015preg_quote()
. Я тоже их все время забываю :preg_quote($_GET["regex"], "/")
- person Rizier123   schedule 02.05.2015~~
, то этой проблемы можно избежать. - person halfer   schedule 02.05.2015