IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Extraction du nom d'un php dans une ligne de code


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    Par défaut Extraction du nom d'un php dans une ligne de code
    Bonjour,
    voila qui doit être bien banal pour certains, mais je bloque sur la fabrication d'un robot qui va changer
    dans 8000 php tout mes liens il me suffirait de repérer les lignes concernées, ça c'es OK avec cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?php
    /* ==========dans ma boucle de lecture ligne par ligne d'un php============= */
    $pos = strpos($fileligne, ".php");
      if ($pos>0)
                  { 
                   /* alors je veux le nom */  
                   }
    Je ne sais rien de la ligne et n'est pas d'autre repaires que la fin du nom :".php"
    Les lignes pouvant par exemple avoir cette forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <td><div align="center"><a class='LesA3'  href="cpa_009.php"><b>Retour</b></a></div></td>
    Ne sachant pas si le href est href=" ou href='
    Mille mercis d'avance

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ce qu'il te faut c'est preg_replace()
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Ce qu'il te fait c'est preg_replace()
    Bonjour mon Ami de longue date
    Je ne comprends pas ta réponse, car je veux par exemple pour ma ligne type , obtenir "cpa_009.php"

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Si tu veux seulement trouver les occurences, utilise preg_match(), si tu veux trouver et remplacer, utiliser preg_replace()
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Invité
    Invité(e)
    Par défaut
    Mais l'Ami, je ne connait pas du tout la syntaxe de la ligne, ce que je sais, c'est que dans mes 8.000 php
    il n'y a lorsqu'il y en a un, un seul href et forcément .php
    alors quelle syntaxe de preg_match() utiliserais-tu ? je suis incompétent dans cette syntaxe !

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu veux remplacer ou seulement recuperer la valeur ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Invité
    Invité(e)
    Par défaut
    Merci de ton temps, et excuses je rentre à l'instant
    Il me faut uniquement le contenu de href="xxxxxxxxxxxxxxxxxxxx"
    Lorsque j'aurai terminé j'aurais ainsi une table avec les 8.000 php ainsi

    1 toto.php url appelée xxxxxxxxxxxxxxx.php
    2 bidule.php url appelée zzzzzzzzzzzzzz.php

    sachant comme je l'ai dit que l'url peut importe son chemin finie par un .php
    par exemple aras/montier/trouver.php

    Voila j' espères que tu vois mon problème ;-)
    encore merci.

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $text = file_get_contents('tonfichier.php');
    preg_match_all('#[\'|"](.+\.php)[\'|"]#Usi', $text, $output);
    var_dump($output[1]);
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Invité
    Invité(e)
    Par défaut
    Je penses que tu n'a pas lu ma demande ? encore moins testé ta solution,
    comme je l'ai dit j'ais 8.000 fichiers PHP à traiter,
    alors en voici un (ce site n'est pas de moi tu t'en doutes )
    appelles le tonfichier.php et testes ta formule ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    <?php  
    session_start();
    $moijipi="";
    require("index-param.php");
    $Leretour="cheny_home.php";
    $lapage="theme_marco_collec_tonner06.php";
    $titre_baniere="Cheny mon Village, philatélie et marcophilie ";
    $LeTitle="Cheny mon Village, philatélie et marcophilie ";
    $Meta1="Cheny mon Village, philatélie et marcophilie de ".$Meta1;
    $Meta2="Cheny mon Village, philatélie et marcophilie de ".$Meta2;
    require("lesw/wdoctype.php");
    require("lesw/wmenu.php");
    ?>
     
     
    <a class='LesA3'  href="cheny_home.php"><img src="theme/marco/collec/img/home01.gif" border="0" width="16" height="16" alt="Au secours ! Je suis perdu !" align="absmiddle"></a>
    <p align="center"><font size="+2"><b><i>Tonnerre</i></b></font></p>
    <!--  -->
    <table border="0" align="center" cellspacing="5" summary="">
    	<tr>
    		<td><div align="center"><b><i>1896</i></b><br>
    		<i>Lettre de Tonnerre à Villeneuve-l'Archevêque</i></div></td>
    	</tr>
    	<tr>
    		<td><img src="theme/marco/collec/doc/tonner06.jpg" border="0" width="562" height="428" alt=""></td>
    	</tr>
    	<tr>
    		<td><div align="center"></div></td>
    	</tr>
    </table>
    <!--  -->
    <p align="center"><table width="350" border="0" align="center" summary="">
    	<tr>
    		<td><div align="left"><a class='LesA3'  href="tonner05.php"><img src="theme/marco/collec/img/gauche.gif" border="0" width="45" height="25" alt=""></a></div></td>
    		<td><div align="center"><b><a class='LesA3'  href="index.php">Retour</a></b></div></td>
    		<td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
    	</tr>
    </table></p>
    <!--  -->
     
     
    <?php
    require("lesw/wbas.php"); 
    ?>

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    J'ai testé avec un fichier HTML basique, ça fonctionnait.
    Désolé que ça ne fonctionne pas dans ton cas.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  11. #11
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    À noter que dans le fichier que tu donnes, il n'y a pas un lien vers un fichier en .php, mais trois.

    Je te conseille d'utiliser DOMDocument pour extraire les attributs href, ça évite de se prendre les pieds dans le tapis quand la syntaxe utilisée n'est pas celle que tu attends (guillemets simples, guillemets doubles, pas de guillemets du tout, espaces avant ou après le =, href en uppercase...)


    Avec $filenames qui est un tableau contenant les noms de tes fichiers, tu peux faire ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    function has_ext($node, $ext) {
        $path = parse_url($node[0]->nodeValue, PHP_URL_PATH);
        return strtolower(array_pop(explode('.', $path))) === $ext;
    }
     
    libxml_use_internal_errors(true);
     
    $results = [];
     
    foreach($filenames as $filename) {
        $dom = new DOMDocument;
        $dom->loadHTMLFile($filename);
     
        $xp = new DOMXPath($dom);
        $xp->registerNamespace("php", "http://php.net/xpath");
        $xp->registerPHPFunctions("has_ext");
     
        $hrefAttrNodeList = $xp->query('//@href[php:function("has_ext", ., "php")]');
     
        foreach($hrefAttrNodeList as $hrefAttrNode) {
            $results[$filename][] = $hrefAttrNode->nodeValue;
        }
    }
    Tu obtiendras un tableau associatif (dans $results) avec pour clefs les noms de fichiers et pour valeurs un tableau contenant les liens vers un fichier php. Le cas échéant tu n'auras plus qu'à filtrer les résultats dont tu ne veux pas avec array_map ou, si tu ne veux que le premier lien du fichier tu peux changer la requête XPATH en $hrefAttrNodeList = $xp->query('(//@href[php:function("has_ext", ., "php")])[1]';, puis tu remplaces le foreach suivant par if ($hrefAttrNodeList->length)
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  12. #12
    Invité
    Invité(e)
    Par défaut
    Merci de ta réponse, je suis parti sur une lecture ligne par ligne de mes php avec cette fonction qui
    me donne directement ce que je voulais a savoir le chemin/nom du PHP des href !
    Chaque ligne appelle cette fonction c'est super rapide et efficace !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    <?php
    function trouve($a) 
     {
      $lehref="";    
      $pos = strpos($a, ".php");
      if ($pos>0) 
       {
    	$hrefpos = FALSE;
    	$i = -1;
    	while($i < $pos) 
         {
          $i = strpos($a, 'href=', $i+1);
          if($i === FALSE) break;
          $hrefpos = $i;
         }
        if(!($hrefpos === FALSE)) 
         {
          $link = substr($a, $hrefpos + 6, $pos - $hrefpos -2);
          $lehref= $link;
         }
       }
     return $lehref;
     }
    ?>

  13. #13
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Le problème de ton approche est son manque de robustesse, quelques exemples qui mettront ton script en défaut:
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <!-- cas évoqués précédemment  -->
    <a href ="path/file.php">l'espace diabolique</a>
    <A HREF="path/file.php">le <BLINK>HTML3.2</BLINK> de retour des enfers</A>
    <a href=path/file.php>pas de quotes</a>
     
    <!-- pièges de la lecture ligne par ligne -->
        <!-- rien ne garantit que les deux sous chaînes recherchées sont sur la même ligne -->
    <a href=
    "path/file.php">saut de ligne avant la valeur de l'attribut (bizarre mais parfaitement légal)</a>
     
        <!-- ou elles peuvent être sur la même ligne mais appartenir à des éléments différents -->
    <img src="image.php?size=small" /><a href="page.html">présence de l'extension php ailleurs que dans le href</a>
     
        <!-- lignes commentées -->
    <!--
    <a href="path/file.php">cette ligne est ignorée et le lien peut être invalide depuis belle lurette</a>
    -->
     
    <!-- recherche avec strpos, extraction avec substr -->
        <!-- les paramètres GET ne seront pas pris (cela dit, c'est peut être ce que tu souhaites?) --> 
    <a href="path/file.php?key=val">xxx</a>
     
       <!-- ou les ancres -->
    <a href="path/file.php#ancre">xxx</a>
     
        <!-- les sous-chaînes recherchées ne sont pas la où on le pense -->
    <a href="http://www.php.net">www.php.net</a>

    Bref, je pourrais continuer comme ça longtemps, et remarque que ces exemples n'ont rien d'abracadabrant.
    L'utilisation du DOM et de parse_url évite tous ces problèmes.

    Au sujet des performances, certes utiliser DOMDocument nécessite le chargement entier du fichier et la construction de l'arbre DOM, ce qui est moins rapide qu'une approche plus directe par manipulation de chaîne de caractères avec un lecture partielle du fichier. Mais à quoi bon utiliser une approche rapide si tu ne peux pas compter sur ses résultats?
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Combien de condition "And" peut on mettre dans une ligne de code
    Par MichaSarah dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 06/04/2010, 15h39
  2. Comment joindre dans une ligne de code
    Par egg3774 dans le forum VBA Access
    Réponses: 4
    Dernier message: 25/01/2008, 15h35
  3. erreur d'éxecution dans une ligne de code
    Par orlacit dans le forum VBA Access
    Réponses: 9
    Dernier message: 16/11/2007, 10h58
  4. Bug dans une ligne de code VBA
    Par orlacit dans le forum VBA Access
    Réponses: 5
    Dernier message: 08/11/2007, 15h25
  5. Réponses: 5
    Dernier message: 02/09/2006, 15h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo