Сократите JS через PHP с помощью регулярных выражений - PullRequest
0 голосов
/ 23 июня 2018

кто-нибудь посоветует мне минимизацию JS? Я пытаюсь создать его, но безуспешно. Мы покажем вам на примере: https://code.jquery.com/jquery-3.3.1.js

Я хочу

  1. Удалить все комментарии, кроме http & https или внутренних строк
  2. Объединить код в одну строку
  3. Удалите все ненужные пробелы

Я перепробовал множество примеров из Интернета, и это всегда было ошибкой. Даже найденный мной минификатор не сделал этого без ошибок, поэтому я хочу написать собственный собственный минификатор. Я не хочу использовать любой плагин. Я просто хочу чистое регулярное выражение.

Можете ли вы попытаться максимально сократить этот пример? Будь то пробелы, комментарии или какие-то другие улучшения или хитрость?

Пока у меня это есть, и оно тоже не работает

    '(\/\/[^\n\]*[\n\r]+)' => ''
    '/\/\*[\s\S]*?\*\//' => ''
    '#[\r\n]+#' => ''
    '/ {2,}/' => ''

Ответы [ 3 ]

0 голосов
/ 23 июня 2018

Ну, вам понадобится несколько выражений, если вы хотите сделать это с регулярными выражениями:

  1. Многострочные комментарии

    \Q/*\E[\s\S]+?\Q*/\E

  2. Однострочные комментарии:

    (?:http|ftp)s?://(*SKIP)(*FAIL)|//.+

  3. Пробелы:

    ^\s+|\R\s*


В PHP (очевидно, выне нужно называть ваши ключи, только ради многословия):
<?php

$url = "https://code.jquery.com/jquery-3.3.1.js";
$data = file_get_contents($url);

$expressions = array(
    'MULTILINE_COMMENT'     => '\Q/*\E[\s\S]+?\Q*/\E',
    'SINGLELINE_COMMENT'    => '(?:http|ftp)s?://(*SKIP)(*FAIL)|//.+',
    'WHITESPACE'            => '^\s+|\R\s*'
);

foreach ($expressions as $key => $expr) {
    $data = preg_replace('~'.$expr.'~m', '', $data);
}

echo $data;
?>
0 голосов
/ 23 июня 2018

Возможно, это не желаемый ответ, но caddy server выполняет минимизацию на лету.Он очень прост в настройке и обеспечивает зеленую блокировку https также автоматически.

Пример Caddyfile, cors, минификация, ведение журнала, сжатие gzip, более php.

mysite.com {
    root ./mysitefolder/
    gzip
    log ../mysite.log
    minify /
    cors
    fastcgi / /var/run/php/php7.2-fpm.sock {
        ext .php
        split.php
        index index.php
    }
}

https://caddyserver.com/docs/http.minify

0 голосов
/ 23 июня 2018

Вот пример PHP, который очищает комментарии и помещает их все в одну строку.

<?php
$str = <<<EOT
/*
 * Simple javascript function 
 * that writes a square of slashes
 */
function writeSlashes(rows, columns)  {

   for (row = 1; row < rows; row++ ) 
   {
      // The columns
      for ( col = 1; col < columns; col++ )      {
         s = (Math.floor((Math.random() * 2) % 2)) ? "╱" : "╲"; //Randomizing it
         document.write(s);
      }
      document.writeln("<br>");  
    }
}

document.body.innerHTML = "";
document.writeln('<br/><a href="http://www.foo.bar?test"> foo.bar </a><br/><br/>');
writeSlashes(20,20);
EOT;

$re1 = '@ 
  (\/\*[\s\S]*?\*\/\s*) # slash-star comments
| (\s+//.*$)            # whitespaces before forward slashes till end of line
| (^\s+)                # whitespaces at the start of a line
| (?<=[),;:?{}\[\]=<>*%+\-])(\s+) # whitespaces after specific characters
| (\s+)(?=[(,;:?{}\[\]=<>*%+\-])  # whitespaces before specific characters
| [\r\n]+(?!\w)         # next line characters not followed by a word character
@mx';

$result = preg_replace($re1, '', $str);

# remaining multiple whitespaces or next line character to one space
$re2 = '/\s{2,}|[\r\n]+/';
$result = preg_replace($re2,' ', $result);

echo htmlentities($result);

Результат:

function writeSlashes(rows,columns){for(row=1;row<rows;row++){for( col=1;col<columns;col++){s=(Math.floor((Math.random()*2)%2))?"╱":"╲";document.write(s);}document.writeln("<br>");}}document.body.innerHTML="";document.writeln('<br/><a href="http://www.foo.bar?test">foo.bar</a><br/><br/>');writeSlashes(20,20);

Но этот метод не может сравниться с реальной минимизируемой библиотекой, которая могла бы заменить длинные имена переменных и функций на короткие имена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...