wake-up-neo.net

Entfernen Sie alle Zeilenumbrüche aus der HTML-Quelle

Ich weiß, dass Verschleierung eine schlechte Idee ist. Aber ich möchte, dass mein HTML-Code in einer einzigen Zeile steht. Alle HTML-Tags werden über PHP generiert. Ich denke, das ist möglich. Ich wusste, \n\r von regulären Ausdrücken zu ersetzen, habe aber keine Ahnung, wie ich das tun soll. Falls ich unklar bin, handelt es sich hier um ein Beispiel

$output = '<p>
              <div class="title">Hello</div>
           </p>';
echo $output;

Anzeige im Quell-Viewer als <p><div class="title">Hello</div></p>

39
mrN

Vielleicht das?

$output = str_replace(array("\r\n", "\r"), "\n", $output);
$lines = explode("\n", $output);
$new_lines = array();

foreach ($lines as $i => $line) {
    if(!empty($line))
        $new_lines[] = trim($line);
}
echo implode($new_lines);
45
seriousdev

Sie können dies vielleicht versuchen.

// Before any output
ob_start();

// End of file
$output = ob_get_clean();
echo preg_replace('/^\s+|\n|\r|\s+$/m', '', $output);

Dies sollte, wenn ich nicht den Regex durcheinander gebracht habe, die gesamte Ausgabe abfangen und dann alle neuen Zeilenzeichen sowie alle Leerzeichen am Zeilenende und am Zeilenanfang ersetzen.

Wenn Sie bereits alle Ausgaben in einer Variablen gesammelt haben, können Sie natürlich einfach die letzte Zeile direkt verwenden und die Ausgabepuffer überspringen :)

34
Svish

Arbeitete für mich:

$output = str_replace(array("\r\n", "\r", "\n"), "", $output);
14
RayLoveless

Du kannst tun :

$output = '<p>'.
              '<div class="title">Hello</div>'.
           '</p>';

Auf diese Weise enthält $output keinen Zeilensprung.

Das sollte auch funktionieren:

$output = preg_replace(array('/\r/', '/\n/'), '', $output);
5
krtek
$output = preg_replace('!\s+!m', ' ', $output);
3
ling

Dies ist bereits gut beantwortet, aber Sie können möglicherweise mehr als nur Leerzeichen an beiden Enden jeder Zeile schneiden:

  1. Extrahieren Sie zunächst den gesamten Text in Anführungszeichen (Sie möchten diese nicht berühren), ersetzen Sie ihn durch eine Marke mit einer Folgenummer, speichern Sie die Folgenummer mit dem Text
  2. Extrahieren Sie den gesamten Text in <script></script>-Tags und führen Sie das gleiche wie in Schritt 1 aus
  3. Ersetzen Sie alle Leerzeichen (einschließlich\n,\r) durch Leerzeichen
  4. Ersetzen Sie alle> 1 Leerzeichenfolgen durch 1 Leerzeichen
  5. Ersetzen Sie alle >_< durch >< (_ = Leerzeichen)
  6. Ersetzen Sie alle _>, <_ und </_ durch >, < und </ (_ = Leerzeichen)
  7. Ersetzen Sie Markierungen durch die tatsächlichen Texte

Diese Prozedur kann möglicherweise die gesamte HTML-Datei komprimieren. Dadurch wird die Tatsache ausgenutzt, dass mehrere Leerzeichen in HTML-Tags als ein Leerzeichen interpretiert werden.

1
Stephen Chung

<div> darf nicht in <p> enthalten sein - es ist nicht spezifikationsgültig.

Wenn Sie es nicht in einer Variablen speichern müssen, können Sie Folgendes verwenden:

?><div><?php
    ?><div class="title">Hello</div><?php
?></div><?php
0
happy_marmoset

Dies ist eine verbesserte Funktion des Obigen. Es fügt Textbereichsschutz hinzu und auch alles, was ein Tag ist, bleibt unberührt.

Ich habe auch strlen in der Schleife (statisch) entfernt.

Dies kann als One-Pass-Filter schneller ausgeführt werden, um nach geschützten Teilen zu suchen. Für ein so kleines protected_parts-Array wird es effizienter sein, als den $str viermal durchlaufen zu lassen.

Auch das fixiert nicht: class = "" (die zusätzlichen Leerzeichen zwischen = und ") als seinen Inhalt in den Tags.

function MinifyHTML($str) {
$protected_parts = array('<pre>,</pre>','<textarea>,</textarea>', '<,>');
$extracted_values = array();
$i = 0;
foreach ($protected_parts as $part) {
    $finished = false;
    $search_offset = $first_offset = 0;
    $end_offset = 1;
    $startend = explode(',', $part);
    if (count($startend) === 1) $startend[1] = $startend[0];
    $len0 = strlen($startend[0]); $len1 = strlen($startend[1]);
    while ($finished === false) {
        $first_offset = strpos($str, $startend[0], $search_offset);

        if ($first_offset === false) $finished = true;
        else {
            $search_offset = strpos($str, $startend[1], $first_offset + $len0);
            $extracted_values[$i] = substr($str, $first_offset + $len0, $search_offset - $first_offset - $len0);
            $str = substr($str, 0, $first_offset + $len0).'$$#'.$i.'$$'.substr($str, $search_offset);
            $search_offset += $len1 + strlen((string)$i) + 5 - strlen($extracted_values[$i]);
            ++$i;
        }
    }
}
$str = preg_replace("/\s/", " ", $str);
$str = preg_replace("/\s{2,}/", " ", $str);
$replace = array('> <'=>'><', ' >'=>'>','< '=>'<','</ '=>'</');
$str = str_replace(array_keys($replace), array_values($replace), $str);

for ($d = 0; $d < $i; ++$d)
    $str = str_replace('$$#'.$d.'$$', $extracted_values[$d], $str);

return $str;
}
0
piranxa

Dies ist (soweit ich es getestet habe) eine funktionierende Umsetzung der Anweisungen von Stephen Chung. Ich bin von Nummer fünf nicht ganz überzeugt, habe es aber trotzdem aufgenommen.

Legen Sie die Dinge, die Sie schützen möchten, in das protected_parts-Array ein. Tun Sie es, damit Sie sie schützen möchten. Wenn sich Start- und Endebit unterscheiden (wie in HTML-Tags), trennen Sie sie durch ein Komma.

Ich habe auch keine Ahnung, ob dies die am besten optimierte Methode ist, aber es funktioniert für mich und scheint ziemlich schnell zu sein. Fühlen Sie sich frei zu verbessern, etc. (Lassen Sie es mich wissen, wenn Sie es auch tun!)

function MinifyHTML($str) {
    $protected_parts = array("<pre>,</pre>", "\"", "'");
    $extracted_values = array();
    $i = 0;

    foreach ($protected_parts as $part) {
        $finished = false;
        $search_offset = 0;
        $first_offset = 0;
        $startend = explode(",", $part);
        if (count($startend) == 1) { $startend[1] = $startend[0]; }

        while (!$finished) {
            $first_offset = strpos($str, $startend[0], $search_offset);
            if ($first_offset === false) { $finished = true; }
            else {
                $search_offset = strpos($str, $startend[1], $first_offset + strlen($startend[0]));
                $extracted_values[$i] = substr($str, $first_offset + strlen($startend[0]), $search_offset - $first_offset - strlen($startend[0]));
                $str = substr($str, 0, $first_offset + strlen($startend[0]))."$#".$i."$".substr($str, $search_offset);
                $search_offset += strlen($startend[1]) + strlen((string)$i) + 3 - strlen($extracted_values[$i]);
                $i++;
            }
        }
    }

    $str = preg_replace("/\s/", " ", $str);
    $str = preg_replace("/\s{2,}/", " ", $str);
    $str = str_replace("> <", "><", $str);
    $str = str_replace(" >", ">", $str);
    $str = str_replace("< ", "<", $str);
    $str = str_replace("</ ", "</", $str);

    for ($i = count($extracted_values); $i >= 0; $i--) {
        $str = str_replace("$#".$i."$", $extracted_values[$i], $str);
    }

    return $str;
}
0