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>
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);
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 :)
A travaillé pour moi:
$output = str_replace(array("\r\n", "\r", "\n"), "", $output);
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);
$output = preg_replace('!\s+!m', ' ', $output);
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:
<script></script>
et procédez de la même manière qu'à l'étape 1.>_<
par ><
(_ = espace)_>
, <_
et </_
par >
, <
et </
(_ = espace)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.
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
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;
}
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;
}