Простой поиск и замена регулярных выражений в php для минимизации / сжатия javascript?

Можете ли вы опубликовать поиск и замену регулярных выражений в php для минимизации / сжатия javascript?

Например, вот простой для CSS

header('Content-type: text/css'); ob_start("compress"); function compress($buffer) { /* remove comments */ $buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer); /* remove tabs, spaces, newlines, etc. */ $buffer = str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', $buffer); return $buffer; } /* put CSS here */ ob_end_flush(); 

И вот для html:

 <?php /* Minify All Output - based on the search and replace regexes. */ function sanitize_output($buffer) { $search = array( '/\>[^\S ]+/s', //strip whitespaces after tags, except space '/[^\S ]+\</s', //strip whitespaces before tags, except space '/(\s)+/s' // shorten multiple whitespace sequences ); $replace = array( '>', '<', '\\1' ); $buffer = preg_replace($search, $replace, $buffer); return $buffer; } ob_start("sanitize_output"); ?> <html>...</html> 

Но как насчет одного для javascript?

Простое регулярное выражение для минимизации / сжатия javascript вряд ли будет существовать в любом месте. Вероятно, для этого есть несколько веских причин, но вот пара таких причин:

Разрывы строк и точки с запятой. Хорошие миниатюры javascript удаляют все лишние разрывы строк, но поскольку механизмы javascript будут работать без точек с запятой в конце каждого утверждения, мини-редактор может легко сломать этот код, если он не будет достаточно сложным, чтобы наблюдать и обрабатывать разные стили кодирования.

Динамические языковые конструкции. Многие из доступных доступных миниатюр javascript также изменят имена ваших переменных и функций, чтобы минимизировать код. Например, функция с именем «strip_white_space», которая называется 12 раз в вашем файле, может быть переименована в простое «a», для экономии 192 символа в вашем минифицированном коде. Если в вашем файле не много комментариев и / или пробелов, такие оптимизации, как большинство из ваших сбережений сбережений, получаются.

К сожалению, это намного сложнее, чем простое регулярное выражение должно пытаться справиться. Скажем, вы делаете что-то простое:

 var length = 12, height = 15; // other code that uses these length and height values var arr = [1, 2, 3, 4]; for (i = (arr.length - 1); i >= 0; --i) { //loop code } 

Это все допустимый код. НО, как минералог знает, что заменить? Первая «длина» имеет перед ним «var» (но это не обязательно), но «высота» имеет перед собой только запятую. И если минитор достаточно умен, чтобы правильно заменить первую «длину», то насколько умным он должен знать НЕ менять слово «длина» при использовании в качестве свойства массива? Это было бы еще сложнее, если бы вы определили объект javascript, в котором вы конкретно определили свойство length и написали его с той же точечной нотацией.

Опции для нереджекса Существует несколько проектов для решения этой проблемы с использованием более сложных решений, чем просто простое регулярное выражение, но многие из них не делают попыток изменить имена переменных, поэтому я все еще придерживаюсь упаковщика Дина Эдвардса или JSMin Дугласа Крокфорда или что-то вроде компрессора YUI .

PHP-реализация JSMin Дугласа Крокфорда

https://github.com/mrclay/minify

Я пишу на моем собственном minifier, потому что у меня внутри есть PHP . Еще одна проблема не решена. Preg_replace не может обрабатывать кавычки как границу, или лучше не может считать пары и ухудшать котировки. В сделке есть двойные кавычки, экранированные двойные кавычки, одинарные кавычки и экранированные одинарные кавычки. Вот лишь некоторые интересные прег-функции.

 $str=preg_replace('@//.*@','',$str);//delete comments $str=preg_replace('@\s*/>@','>',$str);//delete xhtml tag slash ( />) $str=str_replace(array("\n","\r","\t"),"",$str);//delete escaped white spaces $str=preg_replace("/<\?(.*\[\'(\w+)\'\].*)\?>/","?>$1<?",$str);//rewrite associated array to object $str=preg_replace("/\s*([\{\[\]\}\(\)\|&;]+)\s*/","$1",$str);//delete white spaces between brackets $count=preg_match_all("/(\Wvar (\w{3,})[ =])/", $str, $matches);//find var names $x=65;$y=64; for($i=0;$i<$count;$i++){ if($y+1>90){$y=65;$x++;}//count upper case alphabetic ascii code else $y++; $str=preg_replace("/(\W)(".$matches[$i]."=".$matches[$i]."\+)(\W)/","$1".chr($x).chr($y)."+=$3",$str);//replace 'longvar=longvar+'blabla' to AA+='blabla' $str=preg_replace("/(\W)(".$matches[$i].")(\W)/","$1".chr($x).chr($y)."$3",$str);//replace all other vars } //echo or save $str. ?> 

Вы можете сделать аналогично именам функций:

 $count= preg_match_all("/function (\w{3,})/", $str, $matches); 

Если вы хотите увидеть замененные vars, поместите следующий код в цикл for:

 echo chr($x).chr($y)."=".$matches[$i]."<br>"; 

Отдельный php от JS:

  $jsphp=(array)preg_split("/<\?php|\?>/",$str); for($i=0;$i<count($jsphp);$i++){ if($i%2==0){do something whith js clause} else {do something whith PHP clause} } 

Это всего лишь черновик. Я всегда рад за предложения. Надеюсь, это был Энглиш …