preg_replace_callback存储在全局数组中匹配并替换

时间:2014-12-12 14:37:43

标签: php arrays global preg-replace-callback

我试图压缩HTML代码,但保持样式,脚本,预处理和条件IE不受影响。

我的问题是我无法将函数的匹配存储在数组中。我可以成功替换正则表达式结果,但结果数组为空$idarray

function html_compress($string){

    //Substitute style, script and pre tag with unique id

    $idarray=array();

    $search=array('@<!--\[if\s(?:[^<]+|<(?!!\[endif\]-->))*<!\[endif\]-->@','@<script[^>]*>(?:[^<]+|)</script>@','@<style[^>]*>(?:[^<]+|)</style>@','@<pre[^>]*>(?:[^<]+|)</pre>@','@//<!\[CDATA\[(?:[^<]+|)//]]>@');
    $string=preg_replace_callback($search,
                                  function($m){
                                      $id=uniqid();
                                      global $idarray;
                                      $idarray[]=array($id,$m);
                                      return '<!['.$id.']!>';
                                  },
                                  $string
    );

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

    //Remove blank lines
    $string=preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $string);

    //Replace unique id with script, style, pre original tag
    $c=count($idarray);
    for($i=0;$i<$c;$i++){
        $string = str_replace($idarray[$i][0], $idarray[$i][1], $string);
    }

    Mage::log(print_r($idarray, true), null, 'idarray.log');

    return $string;
}

1 个答案:

答案 0 :(得分:0)

好的,一开始:

global $idarray;
$idarray=array();