Давайте начнем с рассмотрения кода, который вы сейчас используете.
$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)
)
#'