Как я могу проверить регулярное выражение?



Я хотел бы проверить правильность регулярного выражения в PHP, предпочтительно перед его использованием. Это единственный способ сделать это на самом деле попытка preg_match() и посмотреть, если он возвращает FALSE?



есть ли более простой / правильный способ проверить допустимое регулярное выражение?

475   10  

10 ответов:

// This is valid, both opening ( and closing )
var_dump(preg_match('~Valid(Regular)Expression~', null) === false);
// This is invalid, no opening ( for the closing )
var_dump(preg_match('~InvalidRegular)Expression~', null) === false);

как pozs сказал, кроме подумайте о том, чтобы положить @ в функции preg_match() (@preg_match()) в тестовой среде для предотвращения предупреждений или уведомлений.

чтобы проверить регулярное выражение, просто запустите его против null(нет необходимости знать данные, которые вы хотите проверить против авансом). Если он возвращает явное значение false (=== false), она сломана. В противном случае он действителен, хотя он не должен совпадать что угодно.

поэтому нет необходимости писать свой собственный валидатор регулярных выражений.это впустую потраченное время...

Я создал простую функцию, которая может быть вызвана для проверки preg

function is_preg_error()
{
    $errors = array(
        PREG_NO_ERROR               => 'Code 0 : No errors',
        PREG_INTERNAL_ERROR         => 'Code 1 : There was an internal PCRE error',
        PREG_BACKTRACK_LIMIT_ERROR  => 'Code 2 : Backtrack limit was exhausted',
        PREG_RECURSION_LIMIT_ERROR  => 'Code 3 : Recursion limit was exhausted',
        PREG_BAD_UTF8_ERROR         => 'Code 4 : The offset didn\'t correspond to the begin of a valid UTF-8 code point',
        PREG_BAD_UTF8_OFFSET_ERROR  => 'Code 5 : Malformed UTF-8 data',
    );

    return $errors[preg_last_error()];
}

Вы можете вызывать эту функцию, используя следующий код :

preg_match('/(?:\D+|<\d+>)*[!?]/', 'foobar foobar foobar');
echo is_preg_error();

Альтернатива-Регулярное Выражение Онлайн Тестер

Если вы хотите динамически проверить регулярное выражение preg_match(...) === false кажется, это ваш единственный вариант. PHP не имеет механизма компиляции регулярных выражений до их использования.

можно найти preg_last_error полезные функции.

С другой стороны, если у вас есть регулярное выражение и просто хотите знать, если это действительно, прежде чем использовать его есть куча инструментов, доступных там. Я нашел rubular.com быть приятным в использовании.

вы можете проверить, является ли это синтаксически правильным регулярным выражением с этим кошмаром регулярного выражения, если ваш движок поддерживает рекурсию (PHP должен).

вы не можете, однако алгоритмически сказать, если он даст результаты, которые вы хотите, не запустив его.

от: есть ли регулярное выражение для обнаружения допустимого регулярного выражения?

/^((?:(?:[^?+*{}()[\]\|]+|\.|\[(?:\^?\.|\^[^\]|[^\^])(?:[^\]\]+|\.)*\]|\((?:\?[:=!]|\?<[=!]|\?>)?(?1)??\)|\(\?(?:R|[+-]?\d+)\))(?:(?:[?+*]|\{\d+(?:,\d*)?\})[?+]?)?|\|)*)$/

без фактического выполнения регулярного выражения у вас нет способа убедиться, что оно действительно. Недавно я реализовал аналогичный RegexValidator для Zend Framework. Прекрасно работать.

<?php
class Nuke_Validate_RegEx extends Zend_Validate_Abstract
{
    /**
     * Error constant
     */
    const ERROR_INVALID_REGEX = 'invalidRegex';

    /**
     * Error messages
     * @var array
     */
    protected $_messageTemplates = array(
        self::ERROR_INVALID_REGEX => "This is a regular expression PHP cannot parse.");

    /**
     * Runs the actual validation
     * @param string $pattern The regular expression we are testing
     * @return bool
     */
    public function isValid($pattern)
    {
        if (@preg_match($pattern, "Lorem ipsum") === false) {
            $this->_error(self::ERROR_INVALID_REGEX);
            return false;
        }
        return true;
    }
}

вы можете проверить регулярное выражение с помощью регулярные выражения и до определенного предела. Проверьте это переполнение стека ответ для получения дополнительной информации.

Примечание: "рекурсивное регулярное выражение" не является регулярным выражением, и эта Расширенная версия регулярного выражения не соответствует расширенным регулярным выражениям.

лучший вариант-использовать preg_match и матч против NULL как @Claudrian сказал

preg_match () возвращает 1, если шаблон соответствует заданному субъекту, 0, если это не так, или FALSE, если произошла ошибка. - руководство PHP

/**
 * Return an error message if the regular expression is invalid
 *
 * @param string $regex string to validate
 * @return string
 */
function invalidRegex($regex)
{
    if(preg_match($regex, null) !== false)
    {
        return '';
    }

    $errors = array(
        PREG_NO_ERROR               => 'Code 0 : No errors',
        PREG_INTERNAL_ERROR         => 'Code 1 : There was an internal PCRE error',
        PREG_BACKTRACK_LIMIT_ERROR  => 'Code 2 : Backtrack limit was exhausted',
        PREG_RECURSION_LIMIT_ERROR  => 'Code 3 : Recursion limit was exhausted',
        PREG_BAD_UTF8_ERROR         => 'Code 4 : The offset didn\'t correspond to the begin of a valid UTF-8 code point',
        PREG_BAD_UTF8_OFFSET_ERROR  => 'Code 5 : Malformed UTF-8 data',
    );

    return $errors[preg_last_error()];
}

который можно использовать вот так.

if($error = invalidRegex('/foo//'))
{
    die($error);
}

Я не уверен, что он поддерживает PCRE, но есть расширение Chrome на https://chrome.google.com/webstore/detail/cmmblmkfaijaadfjapjddbeaoffeccib позвал Тестер Регулярных Выражений. Я сам еще не пользовался им, так что не могу за него поручиться, но, может быть, оно пригодится?

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

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

ответ этот вопрос имеет отличный ответ на создание модульных тестов.

по словам ссылка PCRE, нет такого способа проверить правильность выражения,до Он используется. Но я думаю, что если кто-то использует недопустимое выражение, это ошибка дизайна в этом приложении, а не во время выполнения, поэтому вы должны быть в порядке.

Comments

    Ничего не найдено.