代码之家  ›  专栏  ›  技术社区  ›  user48202

可以使用CodeIgniter输出压缩和<pre>来显示代码块吗?

  •  2
  • user48202  · 技术社区  · 15 年前

    <pre> 从这个代码点火器压缩钩标签?我对正则表达式的理解还不够透彻,不至于把我的页面弄坏。我试过了,但总是能提高产量。

    这个CodeIgniter压缩钩子从代码中去除所有不相干的空白和格式,以便压缩输出。包括 < 依赖于间距和格式来正确显示代码的标记。

    <?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 回复  |  直到 15 年前
        1
  •  4
  •   Alan Moore Chris Ballance    14 年前

    让我们先看看您现在使用的代码。

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

    其目的似乎是将所有空白字符转换为简单的空格,并将每次运行的多个空格压缩为一个。不过,由于 \\1 在第四个替换字符串中。我不认为这是作者的意图。

    如果代码是为你工作的(除了内部匹配之外) <pre>

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

    现在我们可以添加一个lookahead来防止它在内部匹配 <前> 元素:

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

    但事实上,这不是适合你工作的工具。我是说, 看那怪物!你将永远无法维护它,尽管它很复杂,但它仍然远没有它应有的健壮。

    我将敦促您放弃这种方法,使用专用的HTML minifier 相反,但这一点似乎有自己的问题 <前>


    编辑:作为对评论的回应,这里有一个版本排除了 <textarea> 以及 <前> 元素:

    $search = 
      '#(?ix)
        (?>[^\S ]\s*|\s{2,})
        (?=
          (?:(?:[^<]++|<(?!/?(?:textarea|pre)\b))*+)
          (?:<(?>textarea|pre)\b|\z)
        )
        #'
    
    推荐文章