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

Есть ли хороший способ проверить, является ли строка регулярным выражением или обычной строкой в PHP?

В идеале я хочу написать функцию для запуска строки, которая возвращает истину или ложь.

Я посмотрел наpreg_last_error():

<?php
preg_match('/[a-z]/', 'test');
var_dump(preg_last_error());
preg_match('invalid regex', 'test');
var_dump(preg_last_error());
?>

Где очевидно, что первый не ошибка, а второй. Ноpreg_last_error() возвращаетсяint 0 оба раза.

Есть идеи?

 Ignacio Vazquez-Abrams28 мая 2012 г., 03:07
@ThiefMaster: за исключением того, что действительное регулярное выражение будет недействительным.
 Aasmund Eldhuset28 мая 2012 г., 02:52
'invalid regex' этоvalid регулярное выражение - фактически любая строка, которая не содержит специальных символов регулярного выражения, будет действительным регулярным выражением. Пытаться'[' вместо.
 Ignacio Vazquez-Abrams28 мая 2012 г., 02:54
Для тех, кто заботится:'[' не является допустимым регулярным выражением, поэтому не все строки являются допустимыми регулярными выражениями.
 greg0ire28 мая 2012 г., 02:52
Может быть, вы могли бы использовать регулярное выражение для теста ^^
 Hosh Sadiq28 мая 2012 г., 03:01
@AasmundEldhuset,'invalid regex' на самом деле не является допустимым регулярным выражением, PHP возвращаетWarning: preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash in D:\xampp\htdocs\overheard\test.php on line 5.

Ответы на вопрос(4)

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

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

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

if( preg_match("/^\/.+\/[a-z]*$/i",$regex))

Это скажет вам, если строка имеет хороший шанс быть в качестве регулярного выражения. Однако есть много строк, которые проходят эту проверку, но не являются регулярным выражением. Неэкранированные косые черты в середине, неизвестные модификаторы в конце, несоответствующие скобки и т. Д. Могут вызвать проблемы.

Причинаpreg_last_error возвращено 0, потому что «неправильное регулярное выражение» не является:

PREG_INTERNAL_ERROR (an internal error) PREG_BACKTRACK_LIMIT_ERROR (excessively forcing backtracking) PREG_RECURSION_LIMIT_ERROR (excessively recursing) PREG_BAD_UTF8_ERROR (badly formatted UTF-8) PREG_BAD_UTF8_OFFSET_ERROR (offset to the middle of a UTF-8 character)
 04 мар. 2016 г., 19:34
Обратите внимание, что это работает только для регулярных выражений с/ разделители.
 Hosh Sadiq28 мая 2012 г., 03:09
Да, это правильно! Разобрался с этим, просто не знал, как это сделать правильно! Однако, используяtrack_errors работал!
Решение Вопроса

ия в PHP - это использовать его и проверить, не выдано ли предупреждение.

ini_set('track_errors', 'on');
$php_errormsg = '';
@preg_match('/[blah/', '');
if($php_errormsg) echo 'regex is invalid';

Однако использование произвольного пользовательского ввода в качестве регулярного выражения являетсяbad idea, В механизме PCRE раньше были дыры в безопасности (переполнение буфера = & gt; удаленное выполнение кода), и возможно было возможно создать специально созданные длинные регулярные выражения, которые требуют много процессора / памяти для компиляции / выполнения.

 24 авг. 2015 г., 11:55
Почему это лучше, чем просто проверить вывод preg_match?
 Hosh Sadiq28 мая 2012 г., 03:08
Это не произвольный пользовательский ввод, а строки, взятые из таблицы базы данных, которые будут добавлены только через прямой код (для генерации ссылок). Но да, это сработало :) Спасибо!

линии, нет@ кладжи или что-нибудь

// 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? и это делает это.

 13 мая 2018 г., 20:13
Не работает с флагами? Пример "/ (\ n)} [\ s \ n \ r] * $ / s";
 27 июл. 2013 г., 06:56
Я предполагаю, что это потому, что вы не можете обнаружить все регулярные выражения с помощью регулярного выражения - лучшее, что можно сделать, это решить, выглядит ли онkinda like регулярное выражение или нет.
 16 сент. 2016 г., 20:14
Для любителей регулярных выражений ответ наthis question может быть интересно ...
 05 июл. 2013 г., 02:28
Downvotes без причины довольно круто.

Ваш ответ на вопрос