Pregunta

Estoy tratando de hacer una expresión regular para extraer PHP funciones de código fuente PHP. Hasta ahora he utilizado una expresión regular recursiva para extraer todo entre {} pero por otra parte también coincide con cosas como si las declaraciones. Cuando yo uso algo como:

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

No funciona cuando hay más de 1 función en el archivo (probablemente debido a que utiliza la parte 'función' en la recursividad también).

¿Hay alguna manera de hacer esto?

Ejemplo archivo:

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

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

Gracias

¿Fue útil?

Solución

expresiones regulares es la manera incorrecta de hacerlo. Considere tokenizer o reflexión

Otros consejos

Se trasladó aquí desde duplicado pregunta: PHP, expresiones regulares y nuevas líneas

solución 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. Como se sugirió anteriormente tokenizer es la forma preferible ir.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top