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

Тема в разделе "PHP", создана пользователем bumer3, 30 ноя 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. bumer3

    bumer3

    Регистр.:
    10 янв 2008
    Сообщения:
    291
    Симпатии:
    154
    Есть регулярка
    работает отлично но если под условие (.*?) попадает слишком длинный текст (150 КБ) то регулярка просто не находит текст. Если текст маленький все норм. Как полечить это можно.
     
  2. ZCFD

    ZCFD

    Регистр.:
    16 янв 2008
    Сообщения:
    989
    Симпатии:
    437
    а нафига такие дляинные данные регулярками обрабатывать ?

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

    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_posstrlen($start_tag)) );
     
    bumer3 нравится это.
  3. bumer3

    bumer3

    Регистр.:
    10 янв 2008
    Сообщения:
    291
    Симпатии:
    154
    Спасибо за помощь. Про строковые функции сам догадался. Но просто интересно в чем проблема регулярки.
     
  4. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Интересно было-бы посмотреть пример полностью.
     
  5. bumer3

    bumer3

    Регистр.:
    10 янв 2008
    Сообщения:
    291
    Симпатии:
    154
    PHP:
    <?php
    $text 
    file_get_contents("source.txt");
    preg_match("#\[english\](.*?)\[\/english\]#ies"$text,$st_en);
    echo 
    $st_en[1];
    ?>
    В файлике текст [english]тут много текста[/english]
    Так если текста мало то работает норм, если 150 КБ то регулярка ничего не находит
     
  6. ZCFD

    ZCFD

    Регистр.:
    16 янв 2008
    Сообщения:
    989
    Симпатии:
    437
    вопрос - как ты узнаешь что ничего не находит ?
    запусти код
    PHP:
    <?php 
    $text 
    file_get_contents("source.txt"); 
    preg_match("#\[english\](.*?)\[\/english\]#ies"$text,$st_en); 
    echo 
    $st_en[1]; 
    echo 
    "<BR>Done";
    ?>
    что-нибудь выведет ?
    Просто появилось подозрение что банально время выполнения скрипта заканчивается - проверь
     
  7. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Понятно. Видимо, необходимо установить pcre.backtrack_limit в значение, заведомо большее текста между english, либо -1. Посмотреть текущее значение можно в phpinfo();
     
  8. Nellisen

    Nellisen Постоялец

    Регистр.:
    4 авг 2008
    Сообщения:
    54
    Симпатии:
    8
  9. ZCFD

    ZCFD

    Регистр.:
    16 янв 2008
    Сообщения:
    989
    Симпатии:
    437
    2 RolCom: так в регулярке вроде нет обратных ссылок
     
  10. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    backtrack это позиции возврата, необходимые для возврата к предыдущему состоянию совпадения и опробования других вариантов, в случае если попытка поиска части выражения закончилась неудачей.
    Хотя активных позиций для возврата во время действия регулярки тут будет не более одной, всего их будет количество символов текста между english плюс один. Лимита не хватает.
     
Статус темы:
Закрыта.