preg_last_error () говорит, что нет ошибки, когда появляется ошибка - PullRequest
3 голосов
/ 14 февраля 2011

РЕДАКТИРОВАТЬ : Я понимаю, что эту проблему трудно воспроизвести, но если бы кто-то мог предложить указатели относительно вероятной причины этой проблемы, это было бы очень полезно.

РЕДАКТИРОВАТЬ : По запросу, вот $content:

http://pastebin.com/raw.php?i=tHecParp

Это извлеченная веб-страница. create|exited|deleted|updated образцы, я ищу ключевое слово المحتجين в этом.

Следующий код выполняется непрерывно внутри цикла while:

$pattern = "/(create|exited|deleted|updated)/";
$num_found = preg_match_all( $pattern, $content, $matches );

var_dump( $num_found );

if( $num_found === false )
{
    if (preg_last_error() == PREG_NO_ERROR) {
        var_dump( 'There is no error.' );
    }
    else if (preg_last_error() == PREG_INTERNAL_ERROR) {
        var_dump( 'There is an internal error!' );
    }
    else if (preg_last_error() == PREG_BACKTRACK_LIMIT_ERROR) {
        var_dump( 'Backtrack limit was exhausted!' );
    }
    else if (preg_last_error() == PREG_RECURSION_LIMIT_ERROR) {
        var_dump( 'Recursion limit was exhausted!' );
    }
    else if (preg_last_error() == PREG_BAD_UTF8_ERROR) {
        var_dump( 'Bad UTF8 error!' );
    }
    else if (preg_last_error() == PREG_BAD_UTF8_ERROR) {
        var_dump( 'Bad UTF8 offset error!' );
    }
}

Я просто ищу несколько ключевых слов в текстовом файле , считанном в $content.

выход

int(1)
int(1)
int(1)
int(1)
int(1)
bool(false)
string(18) "There is no error."
bool(false)
string(18) "There is no error."
bool(false)
string(18) "There is no error."

Пару раз находит одно ключевое слово, затем начинает возвращать false. Во время тестирования я сохранил $content константу . Поэтому он должен продолжить поиск ключевых слов, вместо этого он возвращает false. Но preg_last_error() не помогает.

Может кто-нибудь объяснить, почему я получаю ложное?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2011

Превышен предел PCRE.

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

Максимальная длина скомпилированного шаблона составляет 65539 (sic) байтов, если PCRE скомпилирован с внутренним размером связывания по умолчанию, равным 2. Если вы хотите обрабатывать регулярные выражения, которые действительно огромны, вы можетеPCRE с внутренним размером связи 3 или 4 (подробности см. В файле README в исходном дистрибутиве и документации по pcrebuild).В этих случаях предел значительно больше.Однако скорость выполнения медленнее.

http://www.pcre.org/pcre.txt

0 голосов
/ 19 февраля 2011

Ваш исходный пример неполон и затрудняет поиск этой проблемы.Наиболее вероятная причина, хотя ваш пример, который я использовал, работает нормально, заключается в том, что у вашего шаблона есть проблема.Меняется ли ваш паттерн в какой-то момент цикла?preg_match_all () вернет FALSE , а preg_last_error () вернет PREG_NO_ERROR , если указанный вами шаблон не скомпилируется .

Существуют другие краяслучаи, но это кажется наиболее вероятным.Можете ли вы обновить ссылку на $ content и предоставить полный источник для цикла while?

...