Что делает начало этого HTML-кода оптимизации? - PullRequest
0 голосов
/ 17 декабря 2010

Трудная часть пытается выяснить, что делает функция stripwhitespace (). stripbuffer () довольно прост, но я какое-то время смотрел на этот маленький кусочек кода, пытаясь его расшифровать, но безрезультатно. Загадочные имена переменных и отсутствие комментариев тоже мало помогают. Мне также пришлось удалить некоторые гиперссылки из кредитов из-за предотвращения спама на этом сайте

<?php 
/* ---------------------------------
26 January, 2008 - 2:55pm:

The example below is adapted from a post by londrum 8:29 pm on June 7, 2007: 
"crunch up your HTML into a single line
a handy little script..."

This PHP code goes at the very TOP of the PHP-enabled HTML webpage
above EVERYTHING else. Recommendation: use a PHP include file for this
to have only one file to maintain. 
--------------------------------- */
function stripwhitespace($bff){
    $pzcr=0;
    $pzed=strlen($bff)-1;
    $rst="";
    while($pzcr<$pzed){
        $t_poz_start=stripos($bff,"<textarea",$pzcr);
        if($t_poz_start===false){
            $bffstp=substr($bff,$pzcr);
            $temp=stripBuffer($bffstp);
            $rst.=$temp;
            $pzcr=$pzed;
        }
        else{
            $bffstp=substr($bff,$pzcr,$t_poz_start-$pzcr);
            $temp=stripBuffer($bffstp);
            $rst.=$temp;
            $t_poz_end=stripos($bff,"</textarea>",$t_poz_start);
            $temp=substr($bff,$t_poz_start,$t_poz_end-$t_poz_start);
            $rst.=$temp;
            $pzcr=$t_poz_end;
        }
    }
    return $rst;
}

function stripBuffer($bff){
    /* carriage returns, new lines */
    $bff=str_replace(array("\r\r\r","\r\r","\r\n","\n\r","\n\n\n","\n\n"),"\n",$bff);
    /* tabs */
    $bff=str_replace(array("\t\t\t","\t\t","\t\n","\n\t"),"\t",$bff);
    /* opening HTML tags */
    $bff=str_replace(array(">\r<a",">\r <a",">\r\r <a","> \r<a",">\n<a","> \n<a","> \n<a",">\n\n <a"),"><a",$bff);
    $bff=str_replace(array(">\r<b",">\n<b"),"><b",$bff);
    $bff=str_replace(array(">\r<d",">\n<d","> \n<d",">\n <d",">\r <d",">\n\n<d"),"><d",$bff);
    $bff=str_replace(array(">\r<f",">\n<f",">\n <f"),"><f",$bff);
    $bff=str_replace(array(">\r<h",">\n<h",">\t<h","> \n\n<h"),"><h",$bff);
    $bff=str_replace(array(">\r<i",">\n<i",">\n <i"),"><i",$bff);
    $bff=str_replace(array(">\r<i",">\n<i"),"><i",$bff);
    $bff=str_replace(array(">\r<l","> \r<l",">\n<l","> \n<l",">  \n<l","/>\n<l","/>\r<l"),"><l",$bff);
    $bff=str_replace(array(">\t<l",">\t\t<l"),"><l",$bff);
    $bff=str_replace(array(">\r<m",">\n<m"),"><m",$bff);
    $bff=str_replace(array(">\r<n",">\n<n"),"><n",$bff);
    $bff=str_replace(array(">\r<p",">\n<p",">\n\n<p","> \n<p","> \n <p"),"><p",$bff);
    $bff=str_replace(array(">\r<s",">\n<s"),"><s",$bff);
    $bff=str_replace(array(">\r<t",">\n<t"),"><t",$bff);
    /* closing HTML tags */
    $bff=str_replace(array(">\r</a",">\n</a"),"></a",$bff);
    $bff=str_replace(array(">\r</b",">\n</b"),"></b",$bff);
    $bff=str_replace(array(">\r</u",">\n</u"),"></u",$bff);
    $bff=str_replace(array(">\r</d",">\n</d",">\n </d"),"></d",$bff);
    $bff=str_replace(array(">\r</f",">\n</f"),"></f",$bff);
    $bff=str_replace(array(">\r</l",">\n</l"),"></l",$bff);
    $bff=str_replace(array(">\r</n",">\n</n"),"></n",$bff);
    $bff=str_replace(array(">\r</p",">\n</p"),"></p",$bff);
    $bff=str_replace(array(">\r</s",">\n</s"),"></s",$bff);
    /* other */
    $bff=str_replace(array(">\r<!",">\n<!"),"><!",$bff);
    $bff=str_replace(array("\n<div")," <div",$bff);
    $bff=str_replace(array(">\r\r \r<"),"><",$bff);
    $bff=str_replace(array("> \n \n <"),"><",$bff);
    $bff=str_replace(array(">\r</h",">\n</h"),"></h",$bff);
    $bff=str_replace(array("\r<u","\n<u"),"<u",$bff);
    $bff=str_replace(array("/>\r","/>\n","/>\t"),"/>",$bff);
    $bff=ereg_replace(" {2,}",' ',$bff);
    $bff=ereg_replace("  {3,}",'  ',$bff);
    $bff=str_replace("> <","><",$bff);
    $bff=str_replace("  <","<",$bff);
    /* non-breaking spaces */
    $bff=str_replace(" &nbsp;","&nbsp;",$bff);
    $bff=str_replace("&nbsp; ","&nbsp;",$bff);
    /* Example of EXCEPTIONS where I want the space to remain
    between two form buttons at */ 
    /* <!-- http://websitetips.com/articles/copy/loremgenerator/ --> */
    /* name="select" /> <input */
    $bff=str_replace(array("name=\"select\" /><input"),"name=\"select\" /> <input",$bff);

    return $bff;
}
ob_start("stripwhitespace");
?>

Ответы [ 4 ]

2 голосов
/ 17 декабря 2010

Мне кажется, что он хрустит все до текстовой области и после текстовой области, но оставляет содержимое текстовой области в покое.

Хотя этот код может быть несколько интересным, PHP, как известно, плохо работает с быстрой строкойманипулирование и все эти вызовы str_replace - плохая, плохая идея.

Я предсказываю, что вы получите более высокую производительность, используя gzip / deflate на веб-сервере для сжатия вывода скрипта перед отправкой.

1 голос
/ 17 декабря 2010

Это определенно беспорядок, но кажется, что он удаляет ненужные пробелы из строки, кроме как из текстовых областей.

0 голосов
/ 18 декабря 2010

в псевдокоде (ish)

bff is the initial buffer
pzcr is the current start
pzed is the current end
rst will have the filtered text appended to it.
while the current start is before the end
  t_pos_start is first position of the textarea (after current start)
  if there is no text area found
    bffstp becomes the substring of the buffer starting at pzcr
    temp is buffer stripped.
    append temp to rst
    set the current start to the current end.
  else
    set bffstp to the substr between the start and the start of the textarea tag
    temp is buffer stripped.
    append temp to rst
    skip the textarea
    temp will be the substr from the start of the text area to the closing text area tag.
    append temp (unfiltered) to rst.
    set the next start to the end of the textarea (at the start of its closing tag).
  end the if
end the while
return the appended buffer (rst)  

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

0 голосов
/ 17 декабря 2010

Очевидно, что делает stripBuffer: он пытается убрать все пробелы из своего ввода.

stripwhitespace работает следующим образом:

function stripwhitespace($input){
    $currentPosition=0; // start from the first char
    $endPosition=strlen($input)-1; // where to stop
    $returnValue="";

    // while there is more input to process
    while($currentPosition<$endPosition){
        // find start of next <textarea> tag
        $startOfNextTextarea=stripos($input,"<textarea",$currentPosition);
        if($startOfNextTextarea===false){
            // no textarea tag remaining:
            // strip ws from remaining input, append to $returnValue and done!
            $bufferToStrip=substr($input,$currentPosition);
            $temp=stripBuffer($bufferToStrip);
            $returnValue.=$temp;
            $currentPosition=$endPosition; // to cause the function to return
        }
        else{
            // <textarea> found
            // strip ws from input in the range [current_position, start_of_textarea)
            $bufferToStrip=substr($input,$currentPosition,$startOfNextTextarea-$currentPosition);
            // append to return value
            $temp=stripBuffer($bufferToStrip);
            $returnValue.=$temp;
            $endOfNextTextarea=stripos($input,"</textarea>",$startOfNextTextarea);
            // get contents of <textarea>, append to return value without stripping ws
            $temp=substr($input,$startOfNextTextarea,$endOfNextTextarea-$startOfNextTextarea);
            $returnValue.=$temp;
            // continue looking for textareas after the end of this one
            $currentPosition=$endOfNextTextarea;
        }
    }
    return $returnValue;
}

Я признаю, что было бы намного сложнее, если бы вы не могли "интуитивно" рассказать, что он пытается сделать, учитывая особую обработку, которую получает содержимое тегов <textarea> в HTML.

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