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 :

Extracteur PHP


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Points : 135
    Points
    135
    Par défaut Extracteur PHP
    Bonjour à tous,

    Je cherche à faire un "petit" script en php qui permet d'extraire uniquement le code php d'un fichier pouvant contenir du php et du html (et donc du js eventuellement). Celui ci doit également supprimer les commentaires et les string, qui ne sont pas à proprement parler du code php.
    Je dois également remplacer tout ce qui est cité ci-dessus par des caractères (n'importe lequel, disons "-"), simplement pour laisser le code php à la même place dans le fichier d'origine et le fichier parser (afin de pouvoir détécter une erreur dans le code php à tel lignes et tel colonne dans le fichier parsé).


    pour le moment je suis parti sur de la regex, mais plus j'avance, plus je me retrouve confronté à d’énorme problème, par exemple:
    * prendre en compte toutes les balises de php existantes (<?php, <?, <% et <script language='php'>)
    * ne pas prendre en compte les "fausses" femeture de balise dans les strings
    * ne pas prendre en compte les balises </script> associée au javascript et non au php
    * ne pas prendre en compte les ouvertures/fermetures de balises dans les commentaires de type bloc (/* */)
    * prendre en compte les fermetures de balise php dans les commentaires inline // (puisque elles sont interprété )
    Et j'en passe des vertes et des pas mûres :'(

    Pour avoir un exemple plus concret, voici le fichier sur lequel je travail pour le moment:

    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
     
    <html>
    	<body>
    	/* html */
    	<!-- <?php echo "string ?> hacked";?> -->
    <?php
    	/* test de code bien degueu ^^
    	 ?> */
    	// another test <?php !! echo "marche pas" ?><div><?php echo "hacked-2";
     
    	if (preg_match('#^/*' . $this->index . '#', "osef")) {
    		echo "fake comment starting in regex";
    	}
     
    	echo "match<br>"
    		."<script>alert(0);</script>";
    ?></div><? echo "same<br>";?>
    <% echo "another way to open php<br>"; %>
     
    <?php echo "<?php strtolower('OSEF');?>";?>
     
    <script language="php">
    	echo "<script>
    		alert('".strtoupper('test1')."');
    	</script>";
    </script>
     
    <script>
    	alert('<script language="php">echo strtolower("HACKED");</script>');
    </script>
    	</body>
    </html>
    <?php echo '<pre>
    <script>
    	alert("00");
    	alert(\'<script language="php">echo strtolower("TEST foireux");</script>\');
    </script></pre>
    ';
    et voici ce que j'essaye d'avoir au final:

    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
    ------
    	------
    	----------
    	-----<?php echo "----------------";?>----
    <?php
    	------------------------------
    	------
    	-------------------------------------------?>-----<?php echo "--------";
     
    	if (preg_match('----' . $this->index . '-', "----")) {
    		echo "------------------------------";
    	}
     
    	echo "---------"
    		."--------------------------";
    ?>------<? echo "--------";?>
    <% echo "---------------------------"; %>
     
    <?php echo "---------------------------";?>
     
    <script language="php">
    	echo "--------
    		-------".strtoupper('-----')."---
    	---------";
    </script>
     
    --------
    	-------<script language="php">echo strtolower("------");</script>---
    ---------
    	-------
    -------
    <?php echo '-----
    --------
    	------------
    	----------------------------------------------------------------------------
    ---------------
    ';
    Alors, bien évidement, je ne vous demande pas de faire le boulot
    D'ailleurs j'ai un peu l'impression d'avoir à recréer toute la première partie de l'interpréteur php (CAD le parsing), et je galère comme pas possible sur ce coup.

    Par contre, si quelqu'un aurait des pistes, ou connaitrait des scripts existant pour faire quelque chose de similaire sur lesquels je puisse m'appuyer pour faire ce que je veux, ça serrait vraiment super, par-ce sur ce coup, je suis en brasse coulée
    Tout conseil sera également le bienvenu

    Merci beaucoup.

  2. #2
    Membre averti
    Avatar de magicshark
    Homme Profil pro
    Dans une SS2I donc pas que JAVA
    Inscrit en
    Octobre 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dans une SS2I donc pas que JAVA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 133
    Points : 320
    Points
    320
    Par défaut
    je pense qu'il faut hiérarchiser les regexp.
    En effet il vaut mieux passer celle qui remplace /* <?php .... ?>*/
    avant celle qui parse <?php ...?>

    donc je dirait (en partant du principe que tu fais de l'OO :
    2 classes

    1ere :
    je lis un fichier pour chaque ligne j'appelle ma seconde classe qui s'occupe du parsing.
    2eme
    une méthode par regexp
    une méthode stringToChar($string, $char) //remplacera tous les caractères de la chaîne ($string ) par le caractère ($char)

    ensuite tu appelles dans l'ordre

    méthode qui remplace /* jusqu'à */
    si pas trouver */ remplace tout et renvoi 1 (par exemple)

    si méthode précédente retourne 1 alors ligne suivante puis appelle méthode qui remplace jusqu'à */ (si pas trouver remplace tout et retourne 1)
    Tant que méthode précédente retourne 1 alors ligne suivante puis appelle méthode qui remplace jusqu'à */ (si pas trouver remplace tout et retourne 1)

    méthode qui remplace " jusqu'à "

    méthode qui remplace ' jusqu'à '
    îne de caractère et de commentaire de type /* */

    méthode qui remplace <script> jusqu’à </script> idem avec retour à 1 pour du multiligne

    méthode qui remplace tous ce qui n'est pas dans une balise php avec code retour pour du multiligne.

    Je crois avoir fais à peu prêt le tour après j'ai peut être oublier des choses mais le principe reste le même
    d'abord tous ce qui exclu qu'on prenne en compte les balise php ou qu'on modifie au sein du php.

    puis tous ce qui n'est pas dans php on remplace.

    J’espère t'avoir aidé.
    Pourquoi faire simple quand on peut faire compliqué.

  3. #3
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Points : 135
    Points
    135
    Par défaut
    Salut à tous,

    Déjà merci beaucoup magicshark pour ta réponse.
    Je pense que je me serais orienté là dessus, mais au final j'ai découvert (grâce à CosmoKnacki que je remercie encore) une fonction php qui m'a fait le café

    Le tokenizer:
    * http://www.php.net/manual/fr/tokens.php
    * http://www.php.net/manual/fr/function.token-name.php
    * http://www.php.net/manual/fr/function.token-get-all.php

    en gros, grâce à ça, tout le code pour faire ce que je voulais tient en quelques lignes apeine:

    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
    $source = file_get_contents("test.php");
    $tokens = token_get_all($source);
     
    $result = '';
    foreach ($tokens as $token) {
    	if (!isset($token[1]))
    		$result .= $token;
    	elseif (
    		$token[0] == T_COMMENT
    		|| $token[0] == T_INLINE_HTML
    		|| $token[0] == T_CONSTANT_ENCAPSED_STRING
    		|| $token[0] == T_START_HEREDOC
    		|| $token[0] == T_END_HEREDOC
    		|| $token[0] == T_ENCAPSED_AND_WHITESPACE
    		|| $token[0] == T_DOC_COMMENT
    	)
    		$result .= preg_replace('#.#', '-', $token[1]); // remplace les caractères non désiré par des "-"
    	else 
    		$result .= $token[1];
    }
     
    echo "<pre>";
    echo htmlspecialchars($result);
    echo "</pre>";
    Voila voila,
    Merci à tous

  4. #4
    Membre averti
    Avatar de magicshark
    Homme Profil pro
    Dans une SS2I donc pas que JAVA
    Inscrit en
    Octobre 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dans une SS2I donc pas que JAVA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 133
    Points : 320
    Points
    320
    Par défaut
    Bravo je connaissait pas du tout ça ma l'aire fichtrement bien pratique
    Pourquoi faire simple quand on peut faire compliqué.

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

Discussions similaires

  1. [EDI] Quel est l'éditeur que vous recommandez pour PHP ?
    Par Lana.Bauer dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 400
    Dernier message: 10/04/2018, 20h08
  2. Quel est le meilleur script PHP de portail (CMS) ?
    Par Lana.Bauer dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 187
    Dernier message: 18/10/2012, 07h45
  3. L'avenir est-il au PHP ?
    Par Manolo dans le forum Langage
    Réponses: 468
    Dernier message: 11/02/2008, 18h54

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