Длинная регулярка (парсинг html)

Тема в разделе "Регулярные выражения", создана пользователем Wertos, 8 июл 2016.

Статус темы:
Закрыта.
  1. Wertos

    Wertos Пьянь местная

    Регистр.:
    13 апр 2007
    Сообщения:
    169
    Симпатии:
    38
    PHP:
    while (preg_match("#<div class=\"((?:[^>]*?))\">(?:(?:(?!<div ).)*?)<div class=\"(?:(?:[^>]*?))\">((?:(?!<div ).)*?)</div>(?:(?:(?!<div ).)*?)<div class=\"(?:(?:[^>]*?))\">((?:(?!<div ).)*?)</div>(?:(?:(?!<div ).)*?)</div>#sie"$text$match))
    {
          
    var_dump($match);
            switch (
    $match[1]) {
                case 
    "sp-wrap":$replace="[spoiler=\"".$match[2]."\"]".$match[3]."[/spoiler]";break;
                case 
    "c-wrap"$replace="[code]".$match[3]."[/code]"; break;
                case 
    "q-wrap":
                    
    $tag_q='';
                    if (
    strripos($match[2], "</b> ")) {
                        
    preg_match("#<b>(.*?)</b>#i",$match[2], $q_author);
                        
    $tag_q"=\"".$q_author[1]."\"";
                    }
                    
    $replace="[quote".$tag_q."]".$match[3]."[/quote]";
                break;
    }
    HTML:
    <div class="sp-wrap">
    <div class="sp-head folded"><span>Заголовок</span></div>
    <div class="sp-body">
    Текст в спойлере
    </div>
    </div>
    HTML:
    <div class="sp-wrap">
    <div class="sp-body" title="Заголовок">
    <h3 class="sp-title">Заголовок</h3>
    Текст в спойлере
    </div>
    </div>
    Помогите переписать под второй вариант, "Текст в спойлере" в ббкод оборачивал, на первый вариант срабатывает отлично. Остальное в функции работает отлично.
    Должно быть так
    Код:
    [spoiler="Заголовок"]Текст в спойлере[/spoiler]
     
  2. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    463
    Симпатии:
    1.168
    Возьмите DOM парсер и живите спокойно. Я пользуюсь phpQuery
     
    dana77 нравится это.
  3. Wertos

    Wertos Пьянь местная

    Регистр.:
    13 апр 2007
    Сообщения:
    169
    Симпатии:
    38
    Я тоже ! Но тут переписывать не свой код.... брррр....
     
  4. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    253
    Симпатии:
    325
    PHP:
    $regex = <<<END
    @
    <div\ class="([^"]*)">\s*
    <div\ class="[^"]*"> ((?>[^<]+|(?!<div ).)*?) </div>\s*
    <div\ class="[^"]*"> ((?>[^<]+|(?!<div ).)*?) </div>\s*
    </div>
    @sxi
    END;

    $text = <<<END

    <div class="sp-wrap">
    <div class="sp-head folded"><span>Заголовок</span></div>
    <div class="sp-body">
    Текст в спойлере
    </div>
    </div>

    END;

    preg_match($regex$text$match);
    var_dump($match);



    //////////////////////////////////////////////////////////////

    $regex = <<<END
    @
    <div\ class="([^"]*)">\s*
    <div\ class="[^"]*"[^>]*>\s*
    <h3\ class="[^"]*"> ((?>[^<]+|(?!<h3).)*?) </h3>\s*
    ((?>[^<]+|(?!<div).)*?) </div>\s*
    </div>
    @sxi
    END;

    $text = <<<END

    <div class="sp-wrap">
    <div class="sp-body" title="Заголовок">
    <h3 class="sp-title">Заголовок</h3>
    Текст в спойлере
    </div>
    </div>

    END;

    preg_match($regex$text$match);
    var_dump($match);

     
    nulledpapa и Wertos нравится это.
Статус темы:
Закрыта.