web-dev-qa-db-fra.com

Supprimer tous les sauts de ligne de la source HTML

Eh bien, je sais que l’obscurcissement est une mauvaise idée. Mais je veux que tout mon code html vienne en une seule ligne longue. Toutes les balises html sont générées via PHP, donc je pense que c'est possible. Je savais qu'il était préférable de remplacer \n\r par une expression régulière, mais je ne savais pas comment faire cela. Au cas où je ne suis pas clair voici un exemple

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

Pour être visualisé dans le visualiseur source en tant que <p><div class="title">Hello</div></p>

39
mrN

Peut être ça?

$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

Vous pouvez essayer ceci peut-être.

// Before any output
ob_start();

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

Cela devrait, sauf si j'ai foiré la regex, récupérer toute la sortie, puis remplacer tous les caractères de nouvelle ligne ainsi que tous les espaces à la fin et au début des lignes.

Si vous avez déjà collecté toutes les sorties dans une variable, vous pouvez bien sûr simplement utiliser la dernière ligne directement et ignorer le travail de mise en mémoire tampon de la sortie :)

34
Svish

A travaillé pour moi:

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

Tu peux faire :

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

De cette façon, $output ne contiendra aucun saut de ligne.

Cela devrait également fonctionner:

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

La réponse est déjà bonne, mais vous pourrez peut-être faire plus que couper des espaces aux deux extrémités de chaque ligne:

  1. Tout d’abord, extrayez tout le texte entre guillemets (vous ne voulez pas y toucher), remplacez-le par un marqueur avec un numéro de séquence, stockez le numéro de séquence avec le texte.
  2. Extrayez tout le texte dans les balises <script></script> et procédez de la même manière qu'à l'étape 1.
  3. Remplacer tous les espaces (y compris les\n,\r) par des espaces
  4. Remplacer toutes les séquences> 1 espace par 1 espace
  5. Remplacer tout >_< par >< (_ = espace)
  6. Remplacez tous les _>, <_ et </_ par >, < et </ (_ = espace)
  7. Remplacer les marqueurs par les textes actuels

Cette procédure peut potentiellement compacter l'intégralité du fichier HTML. Cela tire parti du fait que plusieurs balises de texte en espaces blancs dans les balises HTML sont interprétées comme un seul espace.

1
Stephen Chung

Vous ne pouvez pas avoir <div> dans <p> - ce n'est pas spéc-valide.

Si vous n'avez pas besoin de le stocker dans une variable, vous pouvez utiliser ceci:

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

C'est une fonction améliorée de ce qui précède. Il ajoute une protection de zone de texte et tout ce qui est une étiquette reste inchangé.

J'ai également supprimé strlen dans la boucle (son statique).

Cela pourrait fonctionner plus rapidement en tant que filtre en une passe pour vérifier les pièces protégées. Pour un si petit tableau protected_parts, il sera plus efficace que de boucler quatre fois le $str.

De plus, cela ne corrige pas: class = "" (les espaces supplémentaires entre = et ") en tant que son contenu dans les balises.

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

Il s’agit d’une implémentation (tant que j’ai pu le tester) des instructions de Stephen Chung. Je ne suis pas entièrement convaincu par le numéro cinq, mais je l’ai inclus de toute façon.

Placez les éléments que vous souhaitez protéger dans le tableau protected_parts. Faites-le afin de les protéger. Si les bits de début et de fin sont différents (comme dans les balises HTML), séparez-les en utilisant une virgule.

De plus, je ne sais pas si c'est la manière la plus optimisée de le faire, mais cela fonctionne pour moi et semble assez rapide. N'hésitez pas à m'améliorer, etc. (Faites-le moi savoir si vous aussi!)

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