Регулярное выражение, которое будет сжимать только определенные разделы страницы - PullRequest
0 голосов
/ 29 марта 2011

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

Однако в некоторых разделах моей страницы у меня есть исходный код в тегах pre , и эти пробелы влияют на отображение кода.Мои навыки работы с регулярными выражениями ужасны, поэтому я в основном ищу решение, чтобы эта функция не мешала работать с кодом внутри:

<code> <pre>

Это php-функция

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;
   }

Спасибо за вашу помощь.

Вот что я обнаружил, что работает:

Решение:

<code>function stripBufferSkipPreTags($buffer){
$poz_current = 0;
$poz_end = strlen($buffer)-1;
$result = "";

while ($poz_current < $poz_end){
    $t_poz_start = stripos($buffer, "<pre", $poz_current);
    if ($t_poz_start === false){
        $buffer_part_2strip = substr($buffer, $poz_current);
        $temp = stripBuffer($buffer_part_2strip);
        $result .= $temp;
        $poz_current = $poz_end;
    }
    else{
        $buffer_part_2strip = substr($buffer, $poz_current, $t_poz_start-$poz_current);
        $temp = stripBuffer($buffer_part_2strip);
        $result .= $temp;
        $t_poz_end = stripos($buffer, "
", $ t_poz_start); $ temp = substr ($ buffer), $ t_poz_start, $ t_poz_end- $ t_poz_start); $ result. = $ temp; $ poz_current = $ t_poz_end;}} return $ result;

} ​​

function stripBuffer($buffer){
// change new lines and tabs to single spaces
$buffer = str_replace(array("\r\n", "\r", "\n", "\t"), ' ', $buffer);
// multispaces to single...
$buffer = preg_replace(" {2,}", ' ',$buffer);
// remove single spaces between tags
$buffer = str_replace("> <", "><", $buffer);
// remove single spaces around &nbsp;
$buffer = str_replace(" &nbsp;", "&nbsp;", $buffer);
$buffer = str_replace("&nbsp; ", "&nbsp;", $buffer);
return $buffer;

}

Ответы [ 2 ]

0 голосов
/ 29 марта 2011

Если вы сжимаете из-за дискового пространства, вам следует рассмотреть возможность использования сжатия gz. (php.net/gz_deflate)

0 голосов
/ 29 марта 2011

Регулярные выражения, как известно, являются злыми (см. это и это ), когда дело доходит до парсинга HTML.

Тем не менее, попробуйте сделать то, что вам нужно, по-другому, например, с помощью анализатора DOM и настройки его функций вывода HTML.

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