Проверить, является ли строка регулярным выражением

Есть ли хороший способ тестирования, если строка является регулярным выражением или обычной строкой в ​​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, состоит в том, что «недопустимое регулярное выражение» не является:

  • PREG_INTERNAL_ERROR (внутренняя ошибка)
  • PREG_BACKTRACK_LIMIT_ERROR (чрезмерное принудительное обратное отслеживание)
  • PREG_RECURSION_LIMIT_ERROR (чрезмерно рекурсивно)
  • PREG_BAD_UTF8_ERROR (плохо форматированный UTF-8)
  • PREG_BAD_UTF8_OFFSET_ERROR (смещение до середины символа UTF-8)

Вот хороший ответ:

https://stackoverflow.com/a/12941133/2519073

 if(@preg_match($yourPattern, null) === false){ //pattern is broken }else{ //pattern is real }