Возможно ли использовать выходное сжатие CodeIgniter с <pre>для отображения кодовых блоков? - PullRequest
2 голосов
/ 14 августа 2010

Можно ли исключить теги <pre> из этого хука сжатия воспламенителя кода? Я недостаточно хорошо понимаю регулярные выражения, чтобы не сломать мою страницу. Я пытался, но это всегда поднимает выход.

РЕДАКТИРОВАНИЕ: Этот хук сжатия CodeIgniter удаляет все незаполненные пробелы и форматирование из кода для сжатия вывода. Включая теги <pre>, которые используют этот интервал и форматирование для правильного отображения кода.

Я пытаюсь показать примеры кода на сжатой выходной странице.

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

function compress()
{
    $CI =& get_instance();
    $buffer = $CI->output->get_output();

     $search = array(
        '/\n/',
        '/\>[^\S ]+/s',
        '/[^\S ]+\</s',
        '/(\s)+/s'
      );

     $replace = array(
        ' ',
        '>',
        '<',
        '\\1'
      );

    $buffer = preg_replace($search, $replace, $buffer);

    $CI->output->set_output($buffer);
    $CI->output->_display();
}

?>

1 Ответ

4 голосов
/ 14 августа 2010

Давайте начнем с рассмотрения кода, который вы сейчас используете.

 $search = array(
    '/\n/',
    '/\>[^\S ]+/s',
    '/[^\S ]+\</s',
    '/(\s)+/s'
  );

 $replace = array(
    ' ',
    '>',
    '<',
    '\\1'
  );

Цель состоит в том, чтобы преобразовать все пробельные символы в простые пробелы и сжать каждый цикл из нескольких пробелов до одного.За исключением возможности возврата каретки, вкладок, форм-каналов и других пробельных символов, благодаря \\1 в четвертой строке замены.Я не думаю, что это было задумано автором.

Если бы этот код работал на вас (кроме соответствия внутри <pre> элементов), это, вероятно, сработало бы так же хорошо, если не лучше:

$search = '/(?>[^\S ]\s*|\s{2,})/`;

$replace = ' ';

И теперь мы можем добавить прогноз, чтобы он не совпадал с <pre> элементами:

$search = 
  '#(?>[^\S ]\s*|\s{2,})(?=(?:(?:[^<]++|<(?!/?pre\b))*+)(?:<pre>|\z))#`;

Но на самом деле это не тот инструмент, который вы выполняете.Я имею в виду, посмотрите на этого монстра!Вы никогда не сможете поддерживать его, и каким бы сложным он ни был, он все еще далеко не так надежен, как следовало бы.

Я собирался убедить вас отказаться от этого подхода ивместо этого используйте выделенный HTML minifier , но у этого, похоже, есть свои проблемы с <pre> элементами.Если эта проблема была устранена, или если есть другой минификатор, который бы отвечал вашим потребностям, вам определенно следует пойти по этому пути.


РЕДАКТИРОВАТЬ: В ответ на комментарий, вот версия, которая исключает <textarea>, а также <pre> элементов:

$search = 
  '#(?ix)
    (?>[^\S ]\s*|\s{2,})
    (?=
      (?:(?:[^<]++|<(?!/?(?:textarea|pre)\b))*+)
      (?:<(?>textarea|pre)\b|\z)
    )
    #'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...