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

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

LEXAlForpostl

Мой дом здесь!
Регистрация
21 Май 2008
Сообщения
766
Реакции
228
Здравствуйте.
Подскажите пожалуйста, как на РНР написать скрипт, который бы:
1) Находил в переменной $txt тэг <p>, если у него есть атрибуты, то удалял бы тэг и его содержимое.
<p атрибуты, например align=center> здесь текст </p>
2) Удалял бы тэг <p> вместе с содержимым, если в содержимом меньше n РУССКИХ символов, независимо от того есть ли атрибуты у тега <p>
 
юзай simplexml
 
Здравствуйте.
Подскажите пожалуйста, как на РНР написать скрипт, который бы:
1) Находил в переменной $txt тэг <p>, если у него есть атрибуты, то удалял бы тэг и его содержимое.
<p атрибуты, например align=center> здесь текст </p>
2) Удалял бы тэг <p> вместе с содержимым, если в содержимом меньше n РУССКИХ символов, независимо от того есть ли атрибуты у тега <p>
Не конкретное решение, скорее мысли вслух (тестировал на строке с одним вхождением <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, пропускаем строку через выражение из первого пункта.
 
1)
Код:
{<p\b(?:\s*\b\w+(?:\s*=\s*(?:"[^"]*"|'[^"]*'|[^\s<>'"]+))?)+\s*>.*?
(?:$|</p\s*>|
   (?=</?(?:p|div|body) #здес перечислить теги, которые не могут быть в P
))}ixs
2) На счет второго, чистой регуляркой не получится, используй замену с кодом, либо встроенный в регулярку код (если Perl).
 
Phoenix168, там не только align может быть.
Надо указать
если <p тут что-то есть>, бортовать этот тег.
 
Phoenix168, там не только align может быть.
Надо указать
если <p тут что-то есть>, бортовать этот тег.
align можно смело убрать из выражения. Кстати попробуйте сами проверить годность выражения в RegexBuddy (Для просмотра ссылки Войди или Зарегистрируйся) весьма наглядно :).
 
LEXAlForpostl
Юзал бы ты мою регулярку, эта не всегда работать будет. Или воспользуйся чем-нибудь для разбора DOM.
 
Честно сказать, первый раз вижу, чтобы так писалось на РНР.
Поэтому и не стал юзать.
Это точно для РНР?
 
Это не для PHP, а для PCRE, который встроен в PHP и не только в него.
Маленькая поправочка, вместо:
Код:
|'[^"]*'|
Наверно лучше поставить это:
Код:
|'[^']*'|
Это выражение подойдёт для большинства случаев, но так же все не покрывает.

#здес перечислить теги, которые не могут быть в P
Совпадение то всё равно будет и открывающий <p> с частью контента будут удалены.
 
Маленькая поправочка, вместо:
Код:
|'[^"]*'|
Наверно лучше поставить это:
Код:
|'[^']*'|
Да, опечатка, спасибо.
Это выражение подойдёт для большинства случаев, но так же все не покрывает.
Все валидные работать будут. За исключением толко совсем невероятных случаев - если 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);
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху