На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ALXR
  
    > Регулярное выражение , Помогите составить
      Кто может подсказать, каким регулярным выражением можно вырезать стили???

      есть:

      ExpandedWrap disabled
        ... 1
        <style>
         ...
        </style>
        ... 2
        <style>
         ...
        </style>
        ... 3


      нужно:
      ExpandedWrap disabled
        ... 1
        ... 2
        ... 3


      как можно вырезать именно стилевые блоки???

      Критерий достаточно прост...
      1) блок начинается с '<(любое количество пробелов)script'
      2) заканчивается '/script(любое количество пробелов)>'
      3) между ними '(что угодно кроме >)>(что угодно кроме < и >)<(что угодно кроме <)'
      весь этот блок надо заменить на "пустой блок" или просто "пробел".

      Я с регулярными выражениями плохо дружу... :unsure:
      ЗЫ. Если можно, в виде Perl-совместимой функции. Где-то читал, что так быстрее в ~10-20 раз... <_<
        Пожалуйста:
        ExpandedWrap disabled
          <?
          $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.
          Цитата Trustmaster @
          '#<style[^>]*?>.*?<\/style>#si'


          Но здесь, если я правильно понимаю, не предусмотрено, что:
          1) между < и style могут стоять пробелы (<[ ]*style)
          2) между /style и > могут также быть пробелы (/style[ ]*>)
          3) между этими двумя условиями НЕ МОГУТ быть < и >!!!

          в скобках мои скромные попытки подправить, скорее всего неверные... :whistle:

          при нарушении 3 пункта, могут пропасть целые блоки текста который попал между двумя блоками описаний стиля... :wacko: :blink:

          Добавлено
          Что-то получилось, вроде как... но правда POSIX...

          Привожу пример для вырезания блоков такого рода

          < блок параметры>
          наполнение
          < /блок>

          вместо "блок" могут быть: {style, script и подобные}

          ExpandedWrap disabled
            $blok = ...;
            $tmpl = "(<( *)".$blok.")(([^>])*>)(([^><])*)(<([^>])*)(/".$blok."( *)>)";
            $text = eregi_replace($tmpl, "", $content);


          но опять же повторюсь, POSIX...

          Помоги перевести на PCRE, :whistle: А то что-то у меня никак не выходит... Такую дрянь выдает, да и литературы под рукой нормальной нету, а искать в Инете - в том, что нашел не могу разобраться, или мало примеров, или вообще мало информации... :wall:

          Заранее благодарен... :rolleyes:
            Цитата
            1) между < и style могут стоять пробелы (<[ ]*style)

            Противоречит стандартам HTML/XHTML. Могут содержаться аттрибуты тэгов, что предусмотрено ([^>]*?). Или ты собственный язык разметки изобрел?
            Цитата
            2) между /style и > могут также быть пробелы (/style[ ]*>)

            Аналогично
            Цитата
            в скобках мои скромные попытки подправить, скорее всего неверные...

            при нарушении 3 пункта, могут пропасть целые блоки текста который попал между двумя блоками описаний стиля...

            Данный вариант не проглатывает блоки между двумя блоками описания стилей. И при этом между <style> и </style> могут содержаться угловые скобки (а вдруг они в комментариях CSS содержатся?).

            Добавлено
            Ну уж раз тебе так нужны пробелы и настройка имени тэга, то получай:
            ExpandedWrap disabled
              <?
              $text = '... 1
              <style>
               ...
              </style>
              ... 2
              <style>
               ...
              </style>
              ... 3';
              $block = 'style';
              $text = preg_replace('#< *'.$block.'[^>]*?>.*?<\/'.$block.' *>#si',  '', $text);
              echo $text;
              ?>
              P.S.: Если так уж не хочется, чтобы между <style> и </style> допускались угловые скобки, то
              ExpandedWrap disabled
                <?
                $text = '... 1
                <style>
                 ...
                </style>
                ... 2
                <style>
                 ...
                </style>
                ... 3';
                $block = 'style';
                $text = preg_replace('#< *'.$block.'[^>]*?>[^<>]*?<\/'.$block.' *>#si',  '', $text);
                echo $text;
                ?>
                Цитата Trustmaster @
                Цитата
                1) между < и style могут стоять пробелы (<[ ]*style)

                Противоречит стандартам HTML/XHTML. Могут содержаться аттрибуты тэгов, что предусмотрено ([^>]*?).
                Цитата
                2) между /style и > могут также быть пробелы (/style[ ]*>)

                Аналогично


                Ок... Убедил... :D Но только если уж и смотреть стандарты, тогда формат записи открывающего тега <тег_параметры_>, а закрывающего </тег>; причем знак "_" (подчеркивание) здесь означает любое количество пробелов. 8-)

                Цитата Trustmaster @
                Или ты собственный язык разметки изобрел?
                ;) :lool: Ценю в людях юмор...


                Цитата Trustmaster @
                Данный вариант не проглатывает блоки между двумя блоками описания стилей. И при этом между <style> и </style> могут содержаться угловые скобки (а вдруг они в комментариях CSS содержатся?).

                А если все-таки проглатывает??? Как тогда??? <_<
                ЗЫ. Как вариант, можно отбирать строку по тем-же границам, а внутри запретить (чтобы не было) записи правой границы (что-то типа ([^(/script>)]*)), только как указать в шаблоне, что НЕ ДОЛЖНО быть заданной последовательности символов?? Вот этого я не знаю вообще!!! :no:
                Сообщение отредактировано: ZuArt -
                  Цитата
                  Ок... Убедил... Но только если уж и смотреть стандарты, тогда формат записи открывающего тега <тег_параметры_>, а закрывающего </тег>; причем знак "_" (подчеркивание) здесь означает любое количество пробелов

                  Вариант
                  ExpandedWrap disabled
                    $text = preg_replace('#<'.$block.'[^>]*?>.*?<\/'.$block.'>#si',  '', $text);

                  Как раз поддерживает аттрибуты тэгов и не противоречит стандартам HTML/XHTML.
                  Цитата
                  А если все-таки проглатывает??? Как тогда???

                  Не проглатывается благодаря квантификатору '?' (квантификатор жадности). Проверено на практике (кстати, неплохое способ подкрепления своих слов :)).
                  Цитата
                  ЗЫ. Как вариант, можно отбирать строку по тем-же границам, а внутри запретить (чтобы не было) записи правой границы (что-то типа ([^(/script>)]*)), только как указать в шаблоне, что НЕ ДОЛЖНО быть заданной последовательности символов?? Вот этого я не знаю вообще!

                  Это можно сделать так:
                  ExpandedWrap disabled
                    (?!<\/script>)

                  Но в данном случае это абсолютно лишнее.
                    Спасибо!!! :D
                      спасибо, а если нада только <style>? как тогда? (а то после экзаменов голова вообще не думает)
                        А что мешает в таком случае присвоить $block = 'style', не изменяя при этом больше ничего?
                          ExpandedWrap disabled
                            $block = 'style';
                            $text = preg_replace('#<'.$block.'[^>]*?>.*?<\/'.$block.'>#si',  '', $text);

                          или
                          ExpandedWrap disabled
                            $text = preg_replace('#<style[^>]*?>.*?<\/style>#si',  '', $text);
                            есть html документ. мне необходимо оставить только то, что находиться между тегами <style> а все остальное удалить!

                            <style>
                            это оставить
                            </style>
                            ... 2
                            <style>
                            и это
                            </style>

                            также оставить сами теги
                              Теперь понятно.
                              ExpandedWrap disabled
                                <?
                                $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;
                                ?>
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0449 ]   [ 15 queries used ]   [ Generated: 4.05.24, 19:07 GMT ]