Mon problème : j'ai un fichier HTML (UTF-8) pollué par de nombreuses répétitions inutiles que je veux supprimer via une script PHP utilisant la fonction str_replace. Pb comment faire reconnaître l'espace entre "> </span> pour qu'il soit supprimé. J'ai testé diverses solution, rien ne marche. Avez-vous une idée ?
exemple dans $fichierB supprimer la chaine $fichier
$fichier="<p lang=\"fr-FR\" style=\"text-indent:0pt;margin-left:0pt;margin-top:0pt;margin-bottom:0pt;margin-right:0pt;line-height:10pt;\"><span style=\"font-family:'Times New Roman';font-size:10pt;\"> </span></p>";
$fichier = str_replace("<p lang=\"fr-FR\" style=\"text-indent:0pt;margin-left:0pt;margin-top:0pt;margin-bottom:0pt;margin-right:0pt;line-height:10pt;\"><span style=\"font-family:'Times New Roman';font-size:10pt;\"> </span></p>"," ","$fichierB);
Je sens que c'est tout simple mais comment faire ?
Le sujet est déplacé de la section HTML / CSS vers la section PHP
Merci de colorer votre code à l'aide du bouton Code
Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: php;">Votre code ici</pre>.
> Je sens que c'est tout simple mais comment faire ?
Il faudrait l'identifier (quitte à y aller à l'éditeur hexadécimal), ce détail mis à part, je ne vois pas l'intérêt de passer à une regexp, la chaîne étant connue, si c'est juste pour résoudre ce problème d'espace par un \s(*) sans pour autant l'identifier.
Un espace insécable ?
Sur ton code :
il manque une " à la fin ?
$fichierB n'existe pas
PS : pour éviter d'avoir à échapper toute quote du code HTML, tu aurais pu utiliser la syntaxe heredoc ou nowdoc, ça t'aurait simplifié la vie
J'ai recopié un peu vite mai il y a bien " à la fin de la ligne. J'ai pas tout mis mais $fichierB existe
J'ai testé avec expression reg mais j'y arrive pas.
Désolé j'avais pas compris comment on colorait le code. J'espère que c'est mieux?
$fichier="<p lang=\"fr-FR\" style=\"text-indent:0pt;margin-left:0pt;margin-top:0pt;margin-bottom:0pt;margin-right:0pt;line-height:10pt;\"><span style=\"font-family:'Times New Roman';font-size:10pt;\"> </span></p>";
$fichier = str_replace("<p lang=\"fr-FR\" style=\"text-indent:0pt;margin-left:0pt;margin-top:0pt;margin-bottom:0pt;margin-right:0pt;line-height:10pt;\"><span style=\"font-family:'Times New Roman';font-size:10pt;\"> </span></p>"," ","$fichierB);
J'ai testé Nowcode, ça marche avec une chaine classique, pas avec du HTML. $str OK $fichier pas OK (ignoré)
$str = <<<'EOD'
Exemple de chaîne
sur plusieurs lignes
en utilisant la syntaxe nowdoc.
EOD;
echo $str;
$fichier =
<<<'EOD'
<span style="font-family:'Times New Roman';font-size:11pt;"> </span>
EOD;
echo $fichier;
J'utilise en local Uwamp (pourtant php 7.0.3)
SOS
- Edité par JeanBernardGramunt 27 janvier 2020 à 13:31:25
Il n'y a pas de raison que ça ne fonctionne pas en nowdoc (pas nowcode) et le str_replace n'est plus ?
Bref, ce n'était qu'un détail de syntaxe de toute façon, le problème reste d'identifier cet espacement si tu veux toujours utiliser str_replace. Et dans le cas d'un preg_replace de bourrin, tu dis que ça ne marche pas mais tu n'en donnes pas le code non plus pour autant donc on ne risque pas d'en dire quoi que ce soit.
PS : à moins de nous donner le fichier en question ou qu'il soit disponible en ligne, il ne nous est pas ("forcément") possible d'identifier l'espace nous-mêmes, les espaces insécables notamment n'étant pas reproduits ici (ils - U+A0 - sont substitués par des normaux - U+20) mais je maintiens qu'avec un éditeur hexadécimal tu pourrais l'identifier facilement et de manière certaine. Encore que, à partir d'un copié/collé directement du fichier source, tu ne devrais normalement pas avoir ce problème
Ca pourrait être aussi un simple saut de ligne que tu n'as pas repris. Sachant qu'en plus un saut de ligne est différent suivant l'OS (\r vs \r\n vs \n)
Merci de ton aide ça m'a inspiré. Je ne sais pas pourquoi mais j'ai un truc qui marche via nowdoc mais pas avec expression reg
Mon objectif est de diminuer le poids de fichiers html pou qu'ils chargent plus vite (pourquoi ? Parce qu'utilisé en Afrique ou Internet est souvent via la 3G)
Voici mon programme de test. TOTO (7ième ligne du fichierB) sert à vérifier que les autres lignes disparaissent
<?php
session_start();
$fichierB=<<<'EOD'
<p lang="fr-FR" style="text-indent:0pt;margin-left:0pt;margin-top:0pt;margin-bottom:0pt;margin-right:0pt;line-height:10pt;"><span style="font-family:'Times New Roman';font-size:10pt;"> </span></p>
<p lang="fr-FR" style="text-indent:0pt;margin-left:0pt;margin-top:0pt;margin-bottom:0pt;margin-right:0pt;line-height:10pt;"><span style="font-family:'Times New Roman';font-size:10pt;"> </span></p>
<p lang="fr-FR" style="text-indent:0pt;margin-left:0pt;margin-top:0pt;margin-bottom:0pt;margin-right:0pt;line-height:10pt;"><span style="font-family:'Times New Roman';font-size:10pt;"> </span></p>
<p lang="fr-FR" style="text-indent:0pt;margin-left:0pt;margin-top:0pt;margin-bottom:0pt;margin-right:0pt;line-height:10pt;"><span style="font-family:'Times New Roman';font-size:10pt;"> </span></p>
<p lang="fr-FR" style="text-indent:0pt;margin-left:0pt;margin-top:0pt;margin-bottom:0pt;margin-right:0pt;line-height:10pt;"><span style="font-family:'Times New Roman';font-size:10pt;"> </span></p>
<p lang="fr-FR" style="text-indent:0pt;margin-left:0pt;margin-top:0pt;margin-bottom:0pt;margin-right:0pt;line-height:10pt;"><span style="font-family:'Times New Roman';font-size:10pt;"> </span></p>
<p lang="fr-FR" style="text-indent:0pt;margin-left:0pt;margin-top:0pt;margin-bottom:0pt;margin-right:0pt;line-height:10pt;"><span style="font-family:'Times New Roman';font-size:10pt;">TOTO </span></p>
EOD;
//echo $fichierB;
//Suppression des espaces via expression reg uniquement devant </span> pour tester
$motif1 ='#;> <#';
$fichierC=preg_replace($motif1,";><",$fichierB);
echo $fichierC;"</br>";
// Fin suppression espace ne fonctionne pas
$str=<<<'EOD'
<p lang="fr-FR" style="text-indent:0pt;margin-left:0pt;margin-top:0pt;margin-bottom:0pt;margin-right:0pt;line-height:10pt;"><span style="font-family:'Times New Roman';font-size:10pt;"> </span></p>
EOD;
$fichierC = str_replace("$str","","$fichierB");
echo $fichierC; // Surprise ça marche
Je ne sais pas pourquoi mais j'ai un truc qui marche via nowdoc mais pas avec expression reg
Parce que $motif1 possède une séquence incorrecte de caractères, il manque au moins " entre ; et >
Mon objectif est de diminuer le poids de fichiers html pou qu'ils chargent plus vite (pourquoi ? Parce qu'utilisé en Afrique ou Internet est souvent via la 3G)
Ton éditeur texte offre peut-être de faire des remplacements comme le ferait str_replace() ou comme le ferait preg_replace()
Voici mon programme de test. TOTO (7ième ligne du fichierB) sert à vérifier que les autres lignes disparaissent
Quelques corrections, mais je t'encourage à voir les possibilités de remplacement offertes par ton éditeur texte.
<?php
session_start();
$fichierB = <<<'EOD'
<p lang="fr-FR" style="text-indent:0pt;margin-left:0pt;margin-top:0pt;margin-bottom:0pt;margin-right:0pt;line-height:10pt;"><span style="font-family:'Times New Roman';font-size:10pt;"> </span></p>
<p lang="fr-FR" style="text-indent:0pt;margin-left:0pt;margin-top:0pt;margin-bottom:0pt;margin-right:0pt;line-height:10pt;"><span style="font-family:'Times New Roman';font-size:10pt;"> </span></p>
<p lang="fr-FR" style="text-indent:0pt;margin-left:0pt;margin-top:0pt;margin-bottom:0pt;margin-right:0pt;line-height:10pt;"><span style="font-family:'Times New Roman';font-size:10pt;"> </span></p>
<p lang="fr-FR" style="text-indent:0pt;margin-left:0pt;margin-top:0pt;margin-bottom:0pt;margin-right:0pt;line-height:10pt;"><span style="font-family:'Times New Roman';font-size:10pt;"> </span></p>
<p lang="fr-FR" style="text-indent:0pt;margin-left:0pt;margin-top:0pt;margin-bottom:0pt;margin-right:0pt;line-height:10pt;"><span style="font-family:'Times New Roman';font-size:10pt;"> </span></p>
<p lang="fr-FR" style="text-indent:0pt;margin-left:0pt;margin-top:0pt;margin-bottom:0pt;margin-right:0pt;line-height:10pt;"><span style="font-family:'Times New Roman';font-size:10pt;"> </span></p>
<p lang="fr-FR" style="text-indent:0pt;margin-left:0pt;margin-top:0pt;margin-bottom:0pt;margin-right:0pt;line-height:10pt;"><span style="font-family:'Times New Roman';font-size:10pt;">TOTO </span></p>
<p lang="fr-FR" style="text-indent:0pt;margin-left:0pt;margin-top:0pt;margin-bottom:0pt;margin-right:0pt;line-height:10pt;"><span style="font-family:'Times New Roman';font-size:10pt;"> </span></p>
EOD;
//Suppression des espaces via expression reg
$motif1 = '#<p\b[^>]*><span\b[^>]*>\s+</span></p>\s*#ui';
$fichierC = preg_replace($motif1,'',$fichierB);
echo nl2br(htmlspecialchars($fichierC)), '<hr>';
// Fin suppression
$str = <<<'EOD'
<p lang="fr-FR" style="text-indent:0pt;margin-left:0pt;margin-top:0pt;margin-bottom:0pt;margin-right:0pt;line-height:10pt;"><span style="font-family:'Times New Roman';font-size:10pt;"> </span></p>
EOD;
$fichierC = str_replace($str, "", $fichierB);
echo nl2br(htmlspecialchars($fichierC));
J'ai plus de 2000 fichiers à traiter, c'est pourquoi j'essaye de travailler à un programme php qui pourra faire une boucle en chargeant une variable contenant le fichier.
Avec Notepad je peux remplacer à la main mais chacun des 2000 fichier fait plusieurs milliers de lignes c'est galère de faire à la main, je ne sais s'il existe des macros avec Notepad
Si tu es confortable pour écrire un script sans erreur qui modifiera 2000+ de tes fichiers alors n'hésites pas, mais fait tout de même un backup juste avant l'exécution!
J'utilise Geany et si tu parles de NotePad++ il semble y avoir "Find In Files" (Ctrl+Shift+F) mais je ne m'avancerai pas plus.
En fait le nom des fichiers est de type numérique ex: 6000000.html et ça varie jusqu'à 69999999.html (pas en continue, ouf) donc la boucle est assez facile ... en théorie
Je regarde Geany
Un grand merci pour ta regex, je l'ai adapté à d'autres cas de nettoyages et ça marche impec, j'avais pas bien compris le cours de Mateo (Concevez votre site web...)
Suppression d'espace dans une ligne HTML en PHP
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli