Есть ли хороший способ тестирования, если строка является регулярным выражением или обычной строкой в PHP?
В идеале я хочу написать функцию для запуска строки через, которая возвращает true или false.
Я посмотрел на preg_last_error()
:
<?php preg_match('/[az]/', 'test'); var_dump(preg_last_error()); preg_match('invalid regex', 'test'); var_dump(preg_last_error()); ?>
Где, очевидно, первый – это не ошибка, а вторая. Но preg_last_error()
возвращает int 0
оба раза.
Есть идеи?
Единственный простой способ проверить правильность регулярного выражения в PHP – использовать его и проверить, не выдается ли предупреждение.
ini_set('track_errors', 'on'); $php_errormsg = ''; @preg_match('/[blah/', ''); if($php_errormsg) echo 'regex is invalid';
Однако использование произвольного пользовательского ввода в качестве регулярного выражения – плохая идея . Раньше были дыры в области безопасности (переполнение буфера => удаленное выполнение кода) в механизме PCRE, и возможно было бы создать специально созданные длинные регулярные выражения, для которых требуется много CPU / памяти для компиляции / выполнения.
Почему бы просто не использовать … другое регулярное выражение? Три линии, не @
kludges или что-то еще:
// Test this string $str = "/^[A-Za-z ]+$/"; // Compare it to a regex pattern that simulates any regex $regex = "/^\/[\s\S]+\/$/"; // Will it blend? echo (preg_match($regex, $str) ? "TRUE" : "FALSE");
Или, в функциональной форме, еще более симпатичный:
public static function isRegex($str0) { $regex = "/^\/[\s\S]+\/$/"; return preg_match($regex, $str0); }
Это не проверяет достоверность; но похоже, что вопрос: есть Is there a good way of test if a string is a regex or normal string in PHP?
и он это делает.
Самый простой способ проверить, является ли строка регулярным выражением:
if( preg_match("/^\/.+\/[az]*$/i",$regex))
Это скажет вам, есть ли у строки хорошая вероятность быть в качестве регулярного выражения. Однако существует много строк, которые передают эту проверку, но не могут быть регулярным выражением. Невыраженные косые черты в середине, неизвестные модификаторы в конце, несогласованные круглые скобки и т. Д. Могут вызвать проблемы.
Причина, по которой preg_last_error
возвращает 0, состоит в том, что «недопустимое регулярное выражение» не является:
Вот хороший ответ:
https://stackoverflow.com/a/12941133/2519073
if(@preg_match($yourPattern, null) === false){ //pattern is broken }else{ //pattern is real }