webentwicklung-frage-antwort-db.com.de

Entfernen Sie Whitespace aus HTML

Ich habe HTML-Code wie:

<div class="wrap">
    <div>
        <div id="hmenus">
            <div class="nav mainnavs">
                <ul>
                    <li><a id="nav-questions" href="/questions">Questions</a></li>
                    <li><a id="nav-tags" href="/tags">Tags</a></li>
                    <li><a id="nav-users" href="/users">Users</a></li>
                    <li><a id="nav-badges" href="/badges">Badges</a></li>
                    <li><a id="nav-unanswered" href="/unanswered">Unanswered</a></li>
                </ul>
            </div>
        </div>
    </div>
</div>

Wie entferne ich Leerzeichen zwischen Tags mit PHP?

Wir sollten bekommen:

<div class="wrap"><div><div id="hmenus"><div class="nav mainnavs"><ul><li><a id="nav-questions" href="/questions">Questions</a></li><li><a id="nav-tags" href="/tags">Tags</a></li><li><a id="nav-users" href="/users">Users</a></li><li><a id="nav-badges" href="/badges">Badges</a></li><li><a id="nav-unanswered" href="/unanswered">Unanswered</a></li></ul></div></div></div></div>
33
James

$html = preg_replace('~>\s+<~', '><', $html);

Aber ich verstehe den Sinn davon nicht. Wenn Sie versuchen, die Datengröße zu verkleinern, gibt es bessere Optionen.

52
Czechnology

Es ist eine Weile her, seit diese Frage zum ersten Mal gestellt wurde, aber ich sehe immer noch die Notwendigkeit, diese Antwort zu posten, um Menschen mit dem gleichen Problem zu helfen. 

Keine dieser Lösungen wurde für mich übernommen, daher habe ich diese Lösung gefunden: Verwendung von output_buffer.

Die Funktion ob_start akzeptiert einen Rückruf als Argument, das vor der Ausgabe auf den gesamten String angewendet wird. Wenn Sie also Leerzeichen aus dem String entfernen, bevor Sie die Ausgabe leeren, sind Sie fertig.

/** 
 * Remove multiple spaces from the buffer.
 * 
 * @var string $buffer
 * @return string
 */
function removeWhitespace($buffer)
{
    return preg_replace('/\s+/', ' ', $buffer);
}

ob_start('removeWhitespace');

<!DOCTYPE html>
<html>
    <head></head>
    <body></body>
</html>

ob_get_flush();

Das obige würde so etwas drucken:

<!DOCTYPE html> <html> <head> </head> <body> </body> </html>

Hoffentlich hilft das.

WIE VERWENDEN SIE ES IN OOP

Wenn Sie objektorientierten Code in PHP verwenden, möchten Sie möglicherweise eine Rückruffunktion verwenden, die sich in einem Objekt befindet.

Wenn Sie eine Klasse aufgerufen haben, zum BeispielHTML, müssen Sie diese Codezeile verwenden

ob_start(["HTML","removeWhitespace"]); 
11
Savas Vedova
$html = preg_replace('~>\s*\n\s*<~', '><', $html);

Ich denke, dass dies die Lösung für das <b>Hello</b> <i>world</i>-Problem ist. Die Idee ist, Leerzeichen nur zu entfernen, wenn eine neue Zeile vorhanden ist. Es funktioniert für die gängige HTML-Syntax:

<div class="wrap">
    <div>
    </div>
</div>
4
Martin Angelov

für den Fall, dass jemand dies braucht, Ich habe eine Funktion aus der Antwort von @Martin Angelova und @Savas Vedova geprägt und kam dazu 

<?php 
   function rmspace($buffer){ 
        return preg_replace('~>\s*\n\s*<~', '><', $buffer); 
   };
?>
<?php ob_start("rmspace");  ?>
   //Content goes in here 
<?php ob_end_flush(); ?>

Und es hat mein Problem gelöst. Hinweis: Ich habe keinen Server-Overhead getestet. Stellen Sie sicher, dass Sie ihn testen, bevor Sie ihn in der Produktion einsetzen

4
P.M

Ein RegEx-Ersatz könnte den Trick tun, etwa:

$result = preg_replace('!\s+!smi', ' ', $content);
3
laander

Vielen Dank, dass Sie diese Frage gestellt haben. Das Problem ist tatsächlich der Umgang mit Whitespace-Fehlern in bestimmten Umgebungen. Während die Regex-Lösung im allgemeinen Fall funktioniert, sollten Sie für einen schnellen Hack das führende Leerzeichen entfernen und am Ende jeder Zeile Tags hinzufügen. PHP entfernt den Zeilenumbruch nach einem Abschluss?>. Z.B.:

<ul><?php ?>
<li><a id="nav-questions" href="/questions">Questions</a></li><?php ?>
<li><a id="nav-tags" href="/tags">Tags</a></li><?php ?>
<li><a id="nav-users" href="/users">Users</a></li><?php ?>
<li><a id="nav-badges" href="/badges">Badges</a></li><?php ?>
<li><a id="nav-unanswered" href="/unanswered">Unanswered</a></li><?php ?>
</ul>

Offensichtlich ist dies aus verschiedenen Gründen nicht optimal, aber es funktioniert für ein lokalisiertes Problem, ohne die gesamte Werkzeugkette zu beeinflussen.

2
Chris

Die array reduce-Funktion:

$html = explode("\n", $html);
function trimArray($returner, $value) {
    $returner .= trim($value);
    return $returner;
}
echo $html = array_reduce($html, 'trimArray');
2
Zeigen

Als Post von gpupo bot sich die sauberste Lösung für viele verschiedene Arten von Abstandsformatierungen. Ein unbedeutendes, aber wichtiges Stück wurde am Ende vergessen! Eine abschließende Saitenbesetzung :-p

Unten ist eine getestete und funktionierende Lösung.

function compress_html($content)
{
    $i       = 0;
    $content = preg_replace('~>\s+<~', '><', $content);
    $content = preg_replace('/\s\s+/',  ' ', $content);

    while ($i < 5)
    {
        $content = str_replace('  ', ' ', $content);
        $i++;
    }

    return trim($content);
}
2
tfont
//...
public function compressHtml($content)
{
    $content = preg_replace('~>\s+<~', '><', $content);
    $content = preg_replace('/\s\s+/', ' ', $content);
    $i = 0;
    while ($i < 5) {
        $content = str_replace('  ', ' ', $content);
        $i++;    
    }

    return $content;
}
1
gpupo

Verwenden Sie reguläre Ausdrücke wie:

>(\s).*?<
0
bluefoot
<?php
    define(COMPRESSOR, 1);

        function remove_html_comments($content = '') {
            return preg_replace('/<!--(.|\s)*?-->/', '', $content);
        }
        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 remove_html_comments($buffer);
        }
        if(COMPRESSOR){ ob_start("sanitize_output"); }
    ?>

    <html>  
        <head>
          <!-- comment -->
          <title>Example   1</title>
        </head>
        <body>
           <p>This is       example</p>
        </body>
    </html>


    RESULT: <html><head><title>Example 1</title></head><body><p>This is example</p></body></html> 
0
Rafael Menezes

Ich habe diesen Regex für mich benutzt und es wirkt wie ein Zauber:

preg_replace('/[ \t]+(?!="|\')/', '', $html);

Dieses Muster sucht nach Leerraum und Tabulator (mindestens einem), dh nicht gefolgt von von " oder '. Dies ist, um zu vermeiden, Leerzeichen zwischen HTML-Attributen zu entfernen.

0
alpham8