RecursiveIteratorIterator exclure des dossiers

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • RecursiveIteratorIterator exclure des dossiers

    Bonjour,

    La version 5 de Joomla! comportant de nombreux "@deprecated 4.3 will be removed in 6.0", je cherche à lister (en local) avec un script PHP les fichiers comportant ce message (283 selon notepad++) puis si possible récupérer les conseils de remplacement dans les fichiers concernés (535 classes et fonctions toujours selon notepad++)

    J'ai repris pour modification un autre script que j'utilise ponctuellement pour supprimer des fichiers inutiles, avec maintenant une liste d'exclusion de dossiers qui me permet dans la nouvelle version, avec un scan_dir, de n'afficher ensuite que les dossiers non exclus de premier niveau.
    Le but est d'aller chercher les fichiers dans ces répertoires et sous-répertoires, il me faut donc être récursif, et je n'en suis pas encore là.

    L'ancien script utilise RecursiveIteratorIterator qui me renvoie le chemin complet, par exemple
    D:\wamp64\www\joom52\images
    Dans mon exclusion, j'ai défini comme étant à exclure (dans un tableau $ignore)
    images
    Mais si je fais
    Code:
    foreach ( $results as $r ) {
          if (is_dir($r) && !in_array($r, $ignore )) {
            echo $r . '<br />' ;
        }
    }​
    Le dossier images est listé avec tous ses sous-dossiers, même si j'exclus le chemin de base du dossier (D:\wamp64\www\joom52\) de "$r".
    Comment pourrais-je modifier le code pour que l'exclusion de ces dossiers de premier niveau et leur contenu soit effective ?

    Merci de vos conseils !
    "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
    MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

  • #2
    Hello Robert

    Pour ton premier paragraphe, première question (retrouver la liste des fichiers), tu peux utiliser mon petit script php_grep : https://github.com/cavo789/php_grep

    Sur base de ta recherche, il te donnera la liste des fichiers.
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
    Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

    Commentaire


    • #3
      Merci Christophe !

      Avec mon script actuel, je récupère bien les fichiers et/ou les dossiers selon le besoin.
      Mon problème est que je n'arrive pas à exclure certains dossiers ou fichiers.

      Je viens de tester php_grep, il me trouve 280 fichiers contenant le texte cherché, lors que notepad++ en trouve 5 de plus...
      Je vais essayer d'adapter ton script, ça m'occupera (à la place de Joaktree qui m'épuise : ) !
      "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
      MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

      Commentaire


      • #4
        En fait, j'ai simplement utilisé
        Code:
        foreach ($contents as $key => $folder) {
            if (is_dir($folder) && !in_array($folder, $ignore )) {
                $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($folder), RecursiveIteratorIterator::SELF_FIRST);
                foreach($objects as $name => $object){
                 if ( is_file( $name )){
                     $name = str_replace($path.DS,'',$name);
                     if ( !in_array( $name, $ignore ) ) {
                         $pos_needle = strpos(file_get_contents($name), $needle);
                          if ($pos_needle > 0) {
                              echo($name) . '<br/>';
                            $i++;
                          }
                         $results[] = $name ;
                     }
                 }
                }​
        }
        et j'obtiens bien la liste des fichiers contenant la chaîne ($needle) "removed in 6", mais en n'ayant pas la ligne, il me faudra utiliser fgets() pour la trouver et récupérer son contenu puis les lignes suivantes jusqu'à celle contenant le nom de fonction ou de classe (même 'trait' dans au moins un fichier) à remplacer. Sauf qu'on a aussi cette chaîne dans des fichiers JS, non suivie d'une fonction ou classe.
        Parfois, il faut aussi remonter à la ligne précédente pour avoir un complément d'infos, et dans certains fichiers, cette chaîne est présente de multiples fois.
        Je m'amuse bien !
        "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
        MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

        Commentaire


        • #5
          Envoyé par RobertG Voir le message
          Je viens de tester php_grep, il me trouve 280 fichiers contenant le texte cherché, lors que notepad++ en trouve 5 de plus...
          Oh ? Je n'ai pas connaissance d'un souci au niveau de php_grep, là dans l'instant je suppose qu'il y a un quelconque filtre qui fait que l'on outil ignore 5 occurrences... Étrange.

          Tant mieux si tu as trouvé une solution qui fonctionne pour toi.

          D'ici quelques mois on verra des modifications dans le code de Joomla d'un certain RobertG ;-)

          Christophe (cavo789)
          Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
          Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

          Commentaire


          • #6
            J'ai l'explication : j'avais en effet filtré sur *.php, et en fait il y a 3 JS et 2 ini en plus des 280 !
            Je ne m'attendais pas à trouver cette chaîne dans d'autres que les php.

            Pour le moment, je coince sur la récupération des lignes, mais je l'aurai, un jour !
            cavo789 aime ceci.
            "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
            MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

            Commentaire


            • #7
              Merci pour la confirmation, voilà, l'outil reste fonctionnel, ouf.
              Christophe (cavo789)
              Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
              Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

              Commentaire


              • #8
                En tout cas, merci pour ce script !

                Un exemple de ce que j'obtiens déjà :
                Code:
                libraries\import.legacy.php
                          : 23 * @deprecated 4.4.0 will be removed in 6.0
                libraries\import.php
                          : 23 * @deprecated 4.4.0 will be removed in 6.0
                libraries\loader.php
                          : 97 * @deprecated 4.3 will be removed in 6.0
                          : 179 * @deprecated 4.3 will be removed in 6.0
                          : 285 * @deprecated 4.3 will be removed in 6.0
                          : 469 * @deprecated 4.3 will be removed in 6.0
                          : 723 * @deprecated 4.3 will be removed in 6.0
                libraries\src\Adapter\Adapter.php
                          : 27 * @deprecated 4.3 will be removed in 6.0
                libraries\src\Adapter\AdapterInstance.php
                          : 25 * @deprecated 4.3 will be removed in 6.0​
                cavo789 aime ceci.
                "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
                MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

                Commentaire


                • #9
                  Bonjour,

                  Il me reste toujours la question de l'exclusion de dossiers et de leurs sous-dossiers, afin de ne pas perdre du temps à explorer des centaines de fichiers dont on sait qu'ils ne seront pas concernés par la recherche.
                  Dans le script d'origine (il date de début 2012 et avait été créé avec l'aide de Jean-Claude Richard), l'idée était de ne rechercher des fichiers à supprimer et non listés dans un tableau d'exclusion. Il n'y avait pas lecture du contenu comme dans php_grep.

                  Dans le script sur lequel je travaille, c'est plus de 9.500 fichiers qu'il me faut ouvrir avec file_get_contents dans une version 5.2 sans son dossier installation, pour savoir si le terme cherché existe, puis avec fgets pour trouver la ligne du fichier concerné, et pour n'en trouver que 284 avec 536 lignes trouvées.

                  Ensuite, il faut que je trouve comment récupérer les lignes non vides et celle concernant la fonction, class ou "trait" qu'il faudra remplacer, et là non plus, ce n'est pas gagné.

                  La dernière étape serait de mettre en forme ces résultats pour en faire un glossaire, mais je crains que des doublons de fonctions ou classes existent. Ai-je raison ?
                  "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
                  MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

                  Commentaire


                  • #10
                    Je n'arrive pas à exclure l'affichage de lignes sans intérêt :
                    administrator\components\com_banners\helpers\banne rs.php
                    : 22 * @deprecated 4.3 will be removed in 6.0
                    : 23 * Use \Joomla\Component\Banners\Administrator\Helper\Ban nersHelper instead
                    : 24 */
                    : 25 class BannersHelper extends \Joomla\Component\Banners\Administrator\Helper\Ban nersHelper
                    : 26 {
                    : 27 }​
                    Le premier problème est le slash de "*/", comme c'est un caractère d'échappement, str_replace ne le prend pas en compte, même en trichant en utilisant une variable $as = '*'.DS !
                    Ensuite, str_replace n'est pas non plus capable de supprimer les "{" et "}" de lignes vides par ailleurs, alors j'ai essayé, sans succès :
                    Code:
                    if ((str_replace('*','',trim($line)) >'') || (str_replace($as,'',trim($line)) >'') || (trim($line) !== '{') || (trim($line) !== '}')) {
                    Dans l'exemple, le code du fichier se termine ainsi :
                    Code:
                     * @deprecated  4.3 will be removed in 6.0
                     *              Use \Joomla\Component\Banners\Administrator\Helper\BannersHelper instead
                     */
                    class BannersHelper extends \Joomla\Component\Banners\Administrator\Helper\BannersHelper
                    {
                    }
                    ​
                    et je n'ai donc besoin que des lignes 1,2 et 4.

                    J'ai eu beau chercher dans le manuel PHP et d'autres pages, je ne vois pas quoi faire.

                    PS : dans mon code "if", ce n'est pas "||" mais "&&" qu'il fallait utiliser ! Les lignes vides après "{" et "}" ont bien disparu, mais ça ne règle pas la question de "*/".
                    Dernière édition par RobertG à 19/08/2024, 16h21
                    "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
                    MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

                    Commentaire


                    • #11
                      Bon, en attendant mieux, ci-joint ce que j'obtiens (fichier txt zippé).
                      Le problème est de savoir où s'arrêter d'enregistrer les lignes de code, sachant que dans certains cas, ce n'est pas une fonction ou une classe qui sera supprimée.
                      Quand les termes qui sont définis pour ne plus afficher les lignes suivantes sont rencontrés, on continue la recherche de la chaîne définie, et si donc ils ne sont pas trouvés, on liste tout le fichier...

                      Il faudrait maintenant arriver à relire ce fichier (plus tard le faire directement à la création) pour qu'il soit plus aisément utilisable.
                      Fichiers joints
                      "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
                      MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

                      Commentaire

                      Annonce

                      Réduire
                      Aucune annonce pour le moment.

                      Partenaire de l'association

                      Réduire

                      Hébergeur Web PlanetHoster
                      Travaille ...
                      X