Распарсивание html тэгов

Тема в разделе "Регулярные выражения", создана пользователем LEXAlForpostl, 20 сен 2009.

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

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    708
    Симпатии:
    225
    Здравствуйте.
    Подскажите пожалуйста, как на РНР написать скрипт, который бы:
    1) Находил в переменной $txt тэг <p>, если у него есть атрибуты, то удалял бы тэг и его содержимое.
    <p атрибуты, например align=center> здесь текст </p>
    2) Удалял бы тэг <p> вместе с содержимым, если в содержимом меньше n РУССКИХ символов, независимо от того есть ли атрибуты у тега <p>
     
  2. roddik

    roddik Колбаска

    Регистр.:
    26 янв 2007
    Сообщения:
    351
    Симпатии:
    285
    юзай simplexml
     
  3. Phoenix168

    Phoenix168

    Регистр.:
    15 ноя 2007
    Сообщения:
    182
    Симпатии:
    44
    Не конкретное решение, скорее мысли вслух (тестировал на строке с одним вхождением <p>:(
    1) Для замены
    Код:
    preg_replace( '|<p.*?=[\"\'].*?[\"\']>(.*?)<\/p.*?>|is', '', $str );
    -- где $str ваша строка с тегами <p>;
    2)
    Код:
    preg_match_all('/<p.*?align=[\"\'].*?[\"\']>(.*?)<\/p.*?>/si', $str, $match); //Находим содржимое тегов <p>
    $num = strlen($match[1][0]); // Посчитать символы
    В случае $num < n, пропускаем строку через выражение из первого пункта.
     
  4. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    1)
    Код:
    {<p\b(?:\s*\b\w+(?:\s*=\s*(?:"[^"]*"|'[^"]*'|[^\s<>'"]+))?)+\s*>.*?
    (?:$|</p\s*>|
       (?=</?(?:p|div|body) #здес перечислить теги, которые не могут быть в P
    ))}ixs
    
    2) На счет второго, чистой регуляркой не получится, используй замену с кодом, либо встроенный в регулярку код (если Perl).
     
  5. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    708
    Симпатии:
    225
    Phoenix168, там не только align может быть.
    Надо указать
    если <p тут что-то есть>, бортовать этот тег.
     
  6. Phoenix168

    Phoenix168

    Регистр.:
    15 ноя 2007
    Сообщения:
    182
    Симпатии:
    44
    align можно смело убрать из выражения. Кстати попробуйте сами проверить годность выражения в RegexBuddy (он тут есть) весьма наглядно :).
     
  7. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    LEXAlForpostl
    Юзал бы ты мою регулярку, эта не всегда работать будет. Или воспользуйся чем-нибудь для разбора DOM.
     
  8. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    708
    Симпатии:
    225
    Честно сказать, первый раз вижу, чтобы так писалось на РНР.
    Поэтому и не стал юзать.
    Это точно для РНР?
     
  9. antn

    antn Постоялец

    Регистр.:
    11 июл 2009
    Сообщения:
    104
    Симпатии:
    30
    Это не для PHP, а для PCRE, который встроен в PHP и не только в него.
    Маленькая поправочка, вместо:
    Код:
    |'[^"]*'|
    Наверно лучше поставить это:
    Код:
    |'[^']*'|
    Это выражение подойдёт для большинства случаев, но так же все не покрывает.

    Совпадение то всё равно будет и открывающий <p> с частью контента будут удалены.
     
  10. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Да, опечатка, спасибо.
    Все валидные работать будут. За исключением толко совсем невероятных случаев - если P или закрывающую конструкцию поместить в комментарий.
    Не заметил, что в перовом посте про PHP написанно. Эта регулярка в общем виде, подойдет для многих языков.
    PHP:
    $re '
    {<p\b(?:\s*\b\w+(?:\s*=\s*(?:"[^"]*"|\'[^\']*\'|[^\s<>\'"]+))?)+\s*>.*?
    (?:$|</p\s*>|
       (?=</?(?:p|div|body) #здесь перечислить теги, которые не могут быть в P
    ))}ixs
    '
    ;
    $str preg_replace($re''$str);
     
Статус темы:
Закрыта.