Pergunta

Estou tentando fazer um PHP Regex para extrair funções do código -fonte do PHP. Até agora, eu usei um regex recursivo para extrair tudo entre {}, mas também corresponde a coisas como as instruções. Quando eu uso algo como:

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

Ele não funciona quando há mais de 1 função no arquivo (provavelmente porque ele também usa a parte da 'função' na recursividade).

Há alguma maneira de fazer isso?

Arquivo de exemplo:

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

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

Obrigado

Foi útil?

Solução

Regexps é a maneira errada de fazê -lo. Considerar tokenizer ou reflexão

Outras dicas

Mudou para cá da pergunta duplicada: PHP, Regex e novas linhas

Solução 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);
}

PS, como foi sugerido acima, o Tokenizer é o caminho preferível.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top