Как проверить регулярное выражение с помощью PHP

Я хочу иметь возможность проверять введенное пользователем регулярное выражение, чтобы проверить, действительно ли оно или нет. Первое, что я нашел с PHP filter_var с константой FILTER_VALIDATE_REGEXP но это не делает то, что я хочу, поскольку он должен передать регулярное выражение для параметров, но я не пересматриваю что-либо, так что в основном это просто проверка правильности регулярного выражения.

Но вы поняли, как я могу проверить введенное пользователем регулярное выражение (которое не соответствует ни одному).

Пример проверки, простыми словами:

 $user_inputted_regex = $_POST['regex']; // eg /([az]+)\..*([0-9]{2})/i if(is_valid_regex($user_inputted_regex)) { // The regex was valid } else { // The regex was invalid } 

Примеры проверки:

 /[[0-9]/i // invalid //(.*)/ // invalid /(.*)-(.*)-(.*)/ // valid /([az]+)-([0-9_]+)/i // valid 

Вот идея ( демонстрация ):

 function is_valid_regex($pattern) { return is_int(@preg_match($pattern, '')); } 

preg_match () возвращает количество совпадений шаблонов. Это будет либо 0 раз (без соответствия), либо 1 раз, потому что preg_match () прекратит поиск после первого совпадения.

preg_match () возвращает FALSE, если произошла ошибка.

И чтобы получить причину, почему шаблон недействителен, используйте preg_last_error .

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

Но тогда вы понимаете, что на самом деле нет такого понятия, как недопустимое регулярное выражение. Регулярное выражение основано на производительности. Это либо соответствует, либо нет, и это зависит от предмета теста – даже если выражение или его результаты кажутся бессмысленными.

Другими словами, вы можете тестировать только регулярное выражение для действительного синтаксиса … и это может быть почти что угодно!