Question

Je suis en train de faire une regex PHP pour extraire les fonctions à partir du code source php. Jusqu'à présent, je l'ai utilisé une expression régulière récursif pour extraire tout entre {}, mais il correspond aussi à des choses comme si les déclarations. Quand j'utiliser quelque chose comme:

preg_match_all("/(function .*\(.*\))({([^{}]+|(?R))*})/", $data, $matches);

Il ne fonctionne pas quand il y a plus de 1 fonction dans le fichier (probablement parce qu'il utilise la partie « fonction » dans le récursivité aussi).

Est-il possible de le faire?

Exemple de fichier:

<?php
if($useless)
{
  echo "i don't want this";
}

function bla($wut)
{
  echo "i do want this";
}
?>

Merci

Était-ce utile?

La solution

regexps est la mauvaise façon de le faire. tokenizer ou réflexion

Autres conseils

déménagés ici de double question: PHP, Regex et de nouvelles lignes

solution Regex:

$regex = '~
  function                 #function keyword
  \s+                      #any number of whitespaces 
  (?P<function_name>.*?)   #function name itself
  \s*                      #optional white spaces
  (?P<parameters>\(.*?\))  #function parameters
  \s*                      #optional white spaces
  (?P<body>\{.*?\})        #body of a function
~six';

if (preg_match_all($regex, $input, $matches)) {
  print_r($matches);
}

P.S. Comme on l'a suggéré plus haut tokenizer est beaucoup préférable d'aller.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top