preg_match и длинные строки - PullRequest
3 голосов
/ 11 июня 2010

Это preg_match, который я пытаюсь использовать, чтобы найти определенный текст в текстовом файле.

if (preg_match($regexp,$textFile,$result) > 0) {
    echo "Found ".$result[0];
} else {
    echo "Not found";
}

Однако, результат всегда Found и ничего более.Массив результатов пуст.Теперь я прочитал, что preg_match не может работать с длинными строками.

Мой текстовый файл имеет размер около 300 КБ, поэтому я думаю, что это 300000 символов.

Я на 100% уверен, что искомая строка находитсятекстовый файл, и тот факт, что функция preg_match возвращает значение выше 0, означает, что он нашел его, но он как-то не поместил его в массив результатов.

Итак, мой вопрос: как мне заставить его работать?

регулярное выражение будет /[specific text]\{(\d*)\}/, поэтому, конечно, я хочу иметь возможность получить число в скобках.

Ответы [ 2 ]

8 голосов
/ 11 июня 2010

Вы будете рады, что я нашел этот вопрос. Начиная с PHP 5.2, они ввели ограничение на размер текста, на котором могут использоваться функции PCRE, по умолчанию равное 100k. Это не так плохо. Плохая часть в том, что он молча терпит неудачу , если он больше этого.

Решение? До предела. Параметром инициализации является pcre.backtrack_limit.

0 голосов
/ 22 ноября 2018

Нет, не превышайте предел pcre.Не делай вещи, не понимая их.Это распространенная ошибка в php pcre

Прочитайте этот замечательный ответ @ridgerunner: https://stackoverflow.com/a/7627962/1077650

этот класс регулярных выражений будет повторять (и молча) сбой Apache / PHP снеобработанная ошибка сегментации из-за переполнения стека!

Ошибка PHP 1: PHP устанавливает: pcre.recursion_limit слишком большой.

Ошибка PHP 2: preg_match() не возвращает FALSE при ошибке.

...