Сжатие вывода html, регулярки

Тема в разделе "Как сделать...", создана пользователем Q_BASIC, 15 окт 2014.

  1. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    406
    Симпатии:
    280
    Есть такое сжатие:
    PHP:
    preg_match_all('!(<(?:code|pre|script).*>[^<]+</(?:code|pre|script)>)!i',$html,$pre);
           
    $html preg_replace('!(<(?:code|pre|script).*>[^<]+</(?:code|pre|script)>)!i''#-pre-#'$html);
           
    $html preg_replace('#<!–[^\[].+–>#'''$html);
           
    $html preg_replace('/[\r\n\t]+/'' '$html);
           
    $html preg_replace('/>[\s]+</''><'$html);
           
    $html preg_replace('/[\s]+/'' '$html);
            if(!empty(
    $pre[0]))
              foreach (
    $pre[0] as $tag) {
                 
    $html preg_replace("!#-pre-#!"$tag$html,1);
              }
           return 
    $html;
    Этот код заменяет убирает все переводы строк и табуляцию. Он не должен убирать перевод строк в javascript коде. Он не убирает переводы тут:
    HTML:
    <script type="text/javascript">
        function isName(name){
            alert(name);
        }
    </script>
    НО он убирает перевод строк тут:
    HTML:
    <script type="text/javascript">
    //<!--
        function isName(name){
            alert(name);
        }
    //-->
    </script>
    Мне надо что бы это [^<] не разрешало "<", но разрешало "<!--"
     
  2. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    215
    Симпатии:
    280
    Юзать другую регулярку
    Код:
    '!(<(code|pre|script)[^>]*>.+?</\2>)!is'
    Хотя если подумать тут используется только $pre[0], так что дополнительно заключать все выражение в скобки смысла нет. Метасимвол \s соответствует пробельным символам \n\r\t.
    PHP:
      preg_match_all('!<(code|pre|script)[^>]*>.+?</\1>!is',$html,$pre);
      
    $html preg_replace('!<(code|pre|script)[^>]*>.+?</\1>!is''#-pre-#'$html);
      
    $html preg_replace('#<!-[^\[].+->#s'''$html);
      
    $html preg_replace('/>\s+</''><'$html);
      
    $html preg_replace('/\s+/'' '$html);
      if(!empty(
    $pre[0]))
        foreach (
    $pre[0] as $tag) {
          
    $html preg_replace("!#-pre-#!"$tag$html,1);
        }
     

     
    Последнее редактирование: 16 окт 2014
    mo.Lex нравится это.
  3. mo.Lex

    mo.Lex Создатель

    Регистр.:
    5 окт 2014
    Сообщения:
    13
    Симпатии:
    9
    А как вы используете это сжатие? Давно планирую сделать такое преобразование "на лету", но пока что не смог, а тут готовый код :)
     
  4. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    406
    Симпатии:
    280
    Убирается всё лишнее: http://kaptun.ru/ (Посмотри исходный код)

    PHP:
    echo htmlCompress$tpl->result['main'] );
     
    mo.Lex нравится это.
  5. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    406
    Симпатии:
    280
    Так убрались все переводы строк. Я сделал пока что так:
    PHP:
    function htmlCompress($html)
        {
            
    $html str_replace('<!''#-Commentarii-#'$html);
           
    preg_match_all('!(<(?:code|pre|script).*>[^<]+</(?:code|pre|script)>)!i',$html,$pre);
           
    $html preg_replace('!(<(?:code|pre|script).*>[^<]+</(?:code|pre|script)>)!i''#-pre-#'$html);
           
    $html preg_replace('/[\r\n\t]+/'' '$html);
           
    $html preg_replace('/[\s]+/'' '$html);
            if(!empty(
    $pre[0]))
              foreach (
    $pre[0] as $tag) {
                 
    $html preg_replace("!#-pre-#!"$tag$html,1);
              }
              
    $html str_replace('#-Commentarii-#''<!'$html);
           return 
    $html;
        }
    Но если в JS есть сравнение if(a<b), то оттуда тоже переводы строк исчезают. Надо как-то так:
    Код:
    !(<(?:code|pre|script).*>[^<a-z]+</(?:code|pre|script)>)!i
    но так почему то не работает. Надо что бы запрещало "<буквы", а "<Что-тоКромеБукв" разрешало
     
  6. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    215
    Симпатии:
    280
    Что-то я не понял. Требуется убрать лишние пробелы везде кроме блоков заключенных в <pre> <script> <code>.
    А что с коментарими вроде <!-- /LIveInternet --> которые находятся вне блоков <pre> <script> <code>.
    Выше мной был приведен код, если его использовать без ваших str_replace #-Commentarii-#

    Если использовать вместо .*>[^<a-z]+</ конструкцию [^>]*>.+?</ и добавить модификатор PCRE_DOTALL к шаблону
    Код:
    !(<(?:code|pre|script)[^>]*>.+?</(?:code|pre|script)>)!is
     
    Последнее редактирование: 16 окт 2014
  7. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    406
    Симпатии:
    280
    Ваш код не работает, а комментарии вне pre|code|script в конце заменяются обратно