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

Q_BASIC

Хранитель порядка
Регистрация
30 Ноя 2013
Сообщения
516
Реакции
1.240
Есть такое сжатие:
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>

Мне надо что бы это [^<] не разрешало "<", но разрешало "<!--"
 
Юзать другую регулярку
Код:
'!(<(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);
    }
 
Последнее редактирование:
А как вы используете это сжатие? Давно планирую сделать такое преобразование "на лету", но пока что не смог, а тут готовый код :)
Убирается всё лишнее: Для просмотра ссылки Войди или Зарегистрируйся (Посмотри исходный код)

PHP:
echo htmlCompress( $tpl->result['main'] );
 
Юзать другую регулярку
Код:
'!(<(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);
    }
Так убрались все переводы строк. Я сделал пока что так:
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
но так почему то не работает. Надо что бы запрещало "<буквы", а "<Что-тоКромеБукв" разрешало
 
Что-то я не понял. Требуется убрать лишние пробелы везде кроме блоков заключенных в <pre> <script> <code>.
А что с коментарими вроде <!-- /LIveInternet --> которые находятся вне блоков <pre> <script> <code>.
Выше мной был приведен код, если его использовать без ваших str_replace #-Commentarii-#

Но если в JS есть сравнение if(a<b), то оттуда тоже переводы строк исчезают. Надо как-то так:
Код:
!(<(?:code|pre|script).*>[^<a-z]+</(?:code|pre|script)>)!i
но так почему то не работает. Надо что бы запрещало "<буквы", а "<Что-тоКромеБукв" разрешало
Если использовать вместо .*>[^<a-z]+</ конструкцию [^>]*>.+?</ и добавить модификатор PCRE_DOTALL к шаблону
Код:
!(<(?:code|pre|script)[^>]*>.+?</(?:code|pre|script)>)!is
 
Последнее редактирование:
Что-то я не понял. Требуется убрать лишние пробелы везде кроме блоков заключенных в <pre> <script> <code>.
А что с коментарими вроде <!-- /LIveInternet --> которые находятся вне блоков <pre> <script> <code>.
Выше мной был приведен код, если его использовать без ваших str_replace #-Commentarii-#
Ваш код не работает, а комментарии вне pre|code|script в конце заменяются обратно
 
Назад
Сверху