Проблема с регуляркой

Статус
В этой теме нельзя размещать новые ответы.

bumer3

Постоялец
Регистрация
10 Янв 2008
Сообщения
291
Реакции
155
Есть регулярка
#\[english\](.*?)\[\/english\]#ies
работает отлично но если под условие (.*?) попадает слишком длинный текст (150 КБ) то регулярка просто не находит текст. Если текст маленький все норм. Как полечить это можно.
 
а нафига такие дляинные данные регулярками обрабатывать ?

в этом случае простых строковых функций достаточно

PHP:
<?php
$text='твой  текст';

$start_tag='[english]';
$stop_tag='[/english]';


// вхождение открывающего тега
$start_pos=strpos($text,$start_tag);
// первое вхождение закрывающего тега  после открывающего 
$stop_pos=strpos($text,$stop_tag,$start_pos);
// содержимое
//+strlen($start_tag) --  что бы убрать [english]
$content=substr($text,$start_pos+strlen($start_tag), $stop_pos- ($start_pos+ strlen($start_tag)) );
 
Спасибо за помощь. Про строковые функции сам догадался. Но просто интересно в чем проблема регулярки.
 
Интересно было-бы посмотреть пример полностью.
 
PHP:
<?php
$text = file_get_contents("source.txt");
preg_match("#\[english\](.*?)\[\/english\]#ies", $text,$st_en);
echo $st_en[1];
?>
В файлике текст [english]тут много текста[/english]
Так если текста мало то работает норм, если 150 КБ то регулярка ничего не находит
 
вопрос - как ты узнаешь что ничего не находит ?
запусти код
PHP:
<?php 
$text = file_get_contents("source.txt"); 
preg_match("#\[english\](.*?)\[\/english\]#ies", $text,$st_en); 
echo $st_en[1]; 
echo "<BR>Done";
?>

что-нибудь выведет ?
Просто появилось подозрение что банально время выполнения скрипта заканчивается - проверь
 
Понятно. Видимо, необходимо установить pcre.backtrack_limit в значение, заведомо большее текста между english, либо -1. Посмотреть текущее значение можно в phpinfo();
 
2 RolCom: так в регулярке вроде нет обратных ссылок
 
backtrack это позиции возврата, необходимые для возврата к предыдущему состоянию совпадения и опробования других вариантов, в случае если попытка поиска части выражения закончилась неудачей.
Хотя активных позиций для возврата во время действия регулярки тут будет не более одной, всего их будет количество символов текста между english плюс один. Лимита не хватает.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху