Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.224.73.125] |
|
Сообщ.
#1
,
|
|
|
Кто может подсказать, каким регулярным выражением можно вырезать стили???
есть: ... 1 <style> ... </style> ... 2 <style> ... </style> ... 3 нужно: ... 1 ... 2 ... 3 как можно вырезать именно стилевые блоки??? Критерий достаточно прост... 1) блок начинается с '<(любое количество пробелов)script' 2) заканчивается '/script(любое количество пробелов)>' 3) между ними '(что угодно кроме >)>(что угодно кроме < и >)<(что угодно кроме <)' весь этот блок надо заменить на "пустой блок" или просто "пробел". Я с регулярными выражениями плохо дружу... ЗЫ. Если можно, в виде Perl-совместимой функции. Где-то читал, что так быстрее в ~10-20 раз... |
Сообщ.
#2
,
|
|
|
Пожалуйста:
<? $text = '... 1 <style> ... </style> ... 2 <style> ... </style> ... 3'; $text = preg_replace('#<style[^>]*?>.*?<\/style>#si', '', $text); echo $text; ?> Цитата Где-то читал, что так быстрее в ~10-20 раз Это было в более старых версиях PHP. И не в 10-20, а в 5-10. Я не так давно тестировал ereg vs. preg_match, и разница в выполнении скрипта составляла несколько тысячных секунды в пользу preg_match. Но небольшая разница все-таки есть, к тому же возможностей у PCRE больше, чем у POSIX. |
Сообщ.
#3
,
|
|
|
Цитата Trustmaster @ '#<style[^>]*?>.*?<\/style>#si' Но здесь, если я правильно понимаю, не предусмотрено, что: 1) между < и style могут стоять пробелы (<[ ]*style) 2) между /style и > могут также быть пробелы (/style[ ]*>) 3) между этими двумя условиями НЕ МОГУТ быть < и >!!! в скобках мои скромные попытки подправить, скорее всего неверные... при нарушении 3 пункта, могут пропасть целые блоки текста который попал между двумя блоками описаний стиля... Добавлено Что-то получилось, вроде как... но правда POSIX... Привожу пример для вырезания блоков такого рода < блок параметры> наполнение < /блок> вместо "блок" могут быть: {style, script и подобные} $blok = ...; $tmpl = "(<( *)".$blok.")(([^>])*>)(([^><])*)(<([^>])*)(/".$blok."( *)>)"; $text = eregi_replace($tmpl, "", $content); но опять же повторюсь, POSIX... Помоги перевести на PCRE, А то что-то у меня никак не выходит... Такую дрянь выдает, да и литературы под рукой нормальной нету, а искать в Инете - в том, что нашел не могу разобраться, или мало примеров, или вообще мало информации... Заранее благодарен... |
Сообщ.
#4
,
|
|
|
Цитата 1) между < и style могут стоять пробелы (<[ ]*style) Противоречит стандартам HTML/XHTML. Могут содержаться аттрибуты тэгов, что предусмотрено ([^>]*?). Или ты собственный язык разметки изобрел? Цитата 2) между /style и > могут также быть пробелы (/style[ ]*>) Аналогично Цитата в скобках мои скромные попытки подправить, скорее всего неверные... при нарушении 3 пункта, могут пропасть целые блоки текста который попал между двумя блоками описаний стиля... Данный вариант не проглатывает блоки между двумя блоками описания стилей. И при этом между <style> и </style> могут содержаться угловые скобки (а вдруг они в комментариях CSS содержатся?). Добавлено Ну уж раз тебе так нужны пробелы и настройка имени тэга, то получай: <? $text = '... 1 <style> ... </style> ... 2 <style> ... </style> ... 3'; $block = 'style'; $text = preg_replace('#< *'.$block.'[^>]*?>.*?<\/'.$block.' *>#si', '', $text); echo $text; ?> |
Сообщ.
#5
,
|
|
|
P.S.: Если так уж не хочется, чтобы между <style> и </style> допускались угловые скобки, то
<? $text = '... 1 <style> ... </style> ... 2 <style> ... </style> ... 3'; $block = 'style'; $text = preg_replace('#< *'.$block.'[^>]*?>[^<>]*?<\/'.$block.' *>#si', '', $text); echo $text; ?> |
Сообщ.
#6
,
|
|
|
Цитата Trustmaster @ Цитата 1) между < и style могут стоять пробелы (<[ ]*style) Противоречит стандартам HTML/XHTML. Могут содержаться аттрибуты тэгов, что предусмотрено ([^>]*?). Цитата 2) между /style и > могут также быть пробелы (/style[ ]*>) Аналогично Ок... Убедил... Но только если уж и смотреть стандарты, тогда формат записи открывающего тега <тег_параметры_>, а закрывающего </тег>; причем знак "_" (подчеркивание) здесь означает любое количество пробелов. Цитата Trustmaster @ Ценю в людях юмор...Или ты собственный язык разметки изобрел? Цитата Trustmaster @ Данный вариант не проглатывает блоки между двумя блоками описания стилей. И при этом между <style> и </style> могут содержаться угловые скобки (а вдруг они в комментариях CSS содержатся?). А если все-таки проглатывает??? Как тогда??? ЗЫ. Как вариант, можно отбирать строку по тем-же границам, а внутри запретить (чтобы не было) записи правой границы (что-то типа ([^(/script>)]*)), только как указать в шаблоне, что НЕ ДОЛЖНО быть заданной последовательности символов?? Вот этого я не знаю вообще!!! |
Сообщ.
#7
,
|
|
|
Цитата Ок... Убедил... Но только если уж и смотреть стандарты, тогда формат записи открывающего тега <тег_параметры_>, а закрывающего </тег>; причем знак "_" (подчеркивание) здесь означает любое количество пробелов Вариант $text = preg_replace('#<'.$block.'[^>]*?>.*?<\/'.$block.'>#si', '', $text); Как раз поддерживает аттрибуты тэгов и не противоречит стандартам HTML/XHTML. Цитата А если все-таки проглатывает??? Как тогда??? Не проглатывается благодаря квантификатору '?' (квантификатор жадности). Проверено на практике (кстати, неплохое способ подкрепления своих слов ). Цитата ЗЫ. Как вариант, можно отбирать строку по тем-же границам, а внутри запретить (чтобы не было) записи правой границы (что-то типа ([^(/script>)]*)), только как указать в шаблоне, что НЕ ДОЛЖНО быть заданной последовательности символов?? Вот этого я не знаю вообще! Это можно сделать так: (?!<\/script>) Но в данном случае это абсолютно лишнее. |
Сообщ.
#8
,
|
|
|
Спасибо!!!
|
Сообщ.
#9
,
|
|
|
спасибо, а если нада только <style>? как тогда? (а то после экзаменов голова вообще не думает)
|
Сообщ.
#10
,
|
|
|
А что мешает в таком случае присвоить $block = 'style', не изменяя при этом больше ничего?
|
Сообщ.
#11
,
|
|
|
$block = 'style'; $text = preg_replace('#<'.$block.'[^>]*?>.*?<\/'.$block.'>#si', '', $text); или $text = preg_replace('#<style[^>]*?>.*?<\/style>#si', '', $text); |
Сообщ.
#12
,
|
|
|
есть html документ. мне необходимо оставить только то, что находиться между тегами <style> а все остальное удалить!
<style> это оставить </style> ... 2 <style> и это </style> также оставить сами теги |
Сообщ.
#13
,
|
|
|
Теперь понятно.
<? $text = '... 1 <style> это оставить </style> ... 2 <style> и это </style> ... 3'; $block = 'style'; $text = preg_match_all('#< *'.$block.'[^>]*?>.*?<\/'.$block.' *>#si', $text, $regs); for($i = 0; $i < count($regs[0]); $i++) $result .= $regs[0][$i]; echo $result; ?> |