Partage
  • Partager sur Facebook
  • Partager sur Twitter

Suppression d'espace dans une ligne HTML en PHP

    27 janvier 2020 à 10:22:08

    Bonjour,

    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 ?

    Merci de votre aide

    • Partager sur Facebook
    • Partager sur Twitter
      27 janvier 2020 à 11:14:58

      Bonjour,

      Mauvais forum

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

      Sinon, les expressions régulières tu connais ?

      -
      Edité par Benzouye 27 janvier 2020 à 11:17:39

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        27 janvier 2020 à 11:30:54

        > 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

        -
        Edité par julp 27 janvier 2020 à 11:59:52

        • Partager sur Facebook
        • Partager sur Twitter
          27 janvier 2020 à 13:28:20

          Merci

          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

          • Partager sur Facebook
          • Partager sur Twitter
            27 janvier 2020 à 13:31:37

            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)

            -
            Edité par julp 27 janvier 2020 à 13:40:56

            • Partager sur Facebook
            • Partager sur Twitter
              27 janvier 2020 à 14:17:44

              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



              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                27 janvier 2020 à 17:16:31

                Hello

                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));
                • Partager sur Facebook
                • Partager sur Twitter
                  27 janvier 2020 à 19:21:53

                  Merci de ton aide.

                  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

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    27 janvier 2020 à 20:15:30

                    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.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 janvier 2020 à 10:20:40

                      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...) :)

                      • Partager sur Facebook
                      • Partager sur Twitter

                      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.
                      • Editeur
                      • Markdown