[I need help] рекурсивные регулярки

Тема в разделе "Как сделать...", создана пользователем killserver, 1 июн 2014.

  1. killserver

    killserver Создатель

    Регистр.:
    14 фев 2012
    Сообщения:
    23
    Симпатии:
    0
    Нужна помощь, иль консультация(кому как нравится), как мне верно оформить регулярку для вложенности?
    собственно: регулярка:
    PHP:
    #\\[codes (.*?)\\]([\s\S]*?)\\[/codes\\]#si
    но если взять код вида
    PHP:
    [codes 15]test[codes 16]tests[/codes]testsss[/codes]
    После обработки "забирается" код вида
    HTML:
    [codes 15]test[codes 16]testsss[/codes]
    Как мне забирать полные кусок вида
    HTML:
    [codes 15]test[codes 16]test[/codes]testsss[/codes]
    а потом уже внутреннюю часть
    HTML:
    [codes 16]test[/codes]
    ?
    Прошу помощи...
     
  2. xotox

    xotox Постоялец

    Регистр.:
    10 янв 2013
    Сообщения:
    51
    Симпатии:
    3
    используй функцию preg_match()

    http://www.php.net/manual/ru/function.preg-match.php

    используй параметр

    matches

    В случае, если указан дополнительный параметр matches, он будет заполнен результатами поиска. Элемент $matches[0] будет содержать часть строки, соответствующую вхождению всего шаблона, $matches[1] - часть строки, соответствующую первой подмаске, и так далее.
     
  3. killserver

    killserver Создатель

    Регистр.:
    14 фев 2012
    Сообщения:
    23
    Симпатии:
    0
    как дальше с данными поступить - я знаю, дело в том, что оно регулярку не правильно "обрезает":(
     
  4. DevOrc

    DevOrc Создатель

    Регистр.:
    5 июн 2014
    Сообщения:
    31
    Симпатии:
    10
    Зациклите)
    Код:
    $text="[codes 15]test[codes 16]tests[/codes]testsss[/codes]";
    while (preg_match('~\[codes\s\d+\]([^[]*)\[/codes\]~U',$text, $out)){
        echo '-'.$out[1].'-';
        $text=str_replace($out[0],'',$text);   
        }
     
    killserver нравится это.