web-dev-qa-db-fra.com

Supprimer les espaces du code HTML

J'ai le code HTML comme:

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

Comment supprimer les espaces entre les balises par php?

Nous devrions avoir:

<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

Cela fait un moment que cette question a été posée pour la première fois, mais je vois toujours la nécessité d'afficher cette réponse afin d'aider les personnes ayant le même problème. 

Aucune de ces solutions n’a été adoptée pour moi et j’ai donc proposé cette solution: Utiliser output_buffer.

La fonction ob_start accepte un rappel en tant qu'argument qui est appliqué à la chaîne entière avant de la générer. Par conséquent, si vous supprimez les espaces de la chaîne avant de vider la sortie, vous avez terminé.

/** 
 * 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();

Ce qui précède imprimerait quelque chose comme:

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

J'espère que cela pourra aider.

COMMENT L'UTILISER DANS OOP

Si vous utilisez du code orienté objet dans PHP, vous souhaiterez peut-être utiliser une fonction de rappel intégrée à un objet.

Si vous avez une classe appelée, par exempleHTML, vous devez utiliser cette ligne de code

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

Je pense que c'est la solution au problème <b>Hello</b> <i>world</i>. L'idée est de supprimer les espaces uniquement lorsqu'il y a une nouvelle ligne. Cela fonctionnera pour la syntaxe HTML commune qui est:

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

juste au cas où quelqu'un aurait besoin de ça, J'ai créé une fonction de la réponse de @Martin Angelova et de @Savas Vedova, et 

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

Et cela a résolu mon problème. Remarque: Je n'ai pas testé de surcharge de serveur, assurez-vous de le tester avant de l'utiliser en production

4
P.M

Un remplacement de RegEx pourrait faire l'affaire, quelque chose comme:

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

Merci d'avoir posté cette question. Le problème consiste en effet à gérer les problèmes d'espaces dans certains environnements. Bien que la solution regex fonctionne dans le cas général, pour un piratage rapide, supprimez les espaces et les balises à la fin de chaque ligne PHP supprime la nouvelle ligne après une fermeture?>. Par exemple.:

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

Évidemment, ceci est sous-optimal pour diverses raisons, mais cela fonctionnera pour un problème localisé sans affecter l'ensemble de la chaîne d'outils.

2
Chris

La fonction array reduce:

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

Comme post de gpupo fourni la solution la plus propre pour de nombreux types de formatage d'espacement Cependant, une pièce mineure mais importante a été oubliée à la fin! Une dernière coupe de corde :-p

Vous trouverez ci-dessous une solution testée et efficace.

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

Utilisez des expressions régulières, comme:

>(\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

J'ai utilisé cette regex pour moi et cela fonctionne à merveille:

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

Ce modèle recherche les espaces blancs et les tabulateurs (au moins un), c'est-à-dire non suivi par " ou '. Ceci afin d'éviter de supprimer les espaces entre les attributs html.

0
alpham8