2009-09-16 19 views
7

Tengo un requisito para analizar archivos PHP en C#. Básicamente requerimos que algunos de los desarrolladores en otro país carguen archivos PHP y una vez cargados necesitamos verificar los archivos php y obtener una lista de todos los métodos y clases/funciones, etc.Análisis rápido de PHP en C#

Pensé en usar una expresión regular pero no puedo entrenar si una función pertenece a una clase, etc., así que me preguntaba si ya hay algo 'por ahí' que analizará los archivos PHP y escupirá sus funciones (estoy tratando de evitar escribir una implementación completa de AST) .

¿Alguien tiene alguna idea? Miré a Coco/R pero no pude encontrar un archivo de gramática de PHP. Estoy usando .NET 2.0 y C#.

Respuesta

18

¿Por qué hacer esto en C#? En PHP esto es trivial de hacer. Use la función token_get_all() y dividirá un archivo PHP en una secuencia de lexemas que puede usar para determinar definitivamente la lista de clases y métodos escribiendo una máquina de estados finitos.

Hagas lo que hagas, no intentes hacer esto con expresiones regulares. Será increíblemente tedioso y propenso a errores.

Editar: Hay tres posibilidades básicas para hacer esto:

  1. Hágalo en PHP. Esta será la opción más rápida (para desarrollar) y más simple;
  2. Ejecute un script PHP de línea de comando para hacer esto o generar una serie de tokens que puedan ser interpretados por un programa C#. Este es el siguiente más fácil;
  3. Use Phalanger, un puerto de PHP para .Net framework. Esto podría ser más apetecible para la administración ya que sigue siendo todo el código .Net; o
  4. Use Quercus, un puerto de PHP para Java VM.

Cualquier otra cosa implicará escribir un analizador de PHP (mucho trabajo) o usar expresiones regulares realmente escamosas que serán una pesadilla de soporte no confiable.

que preocuparse por supuestas "fallas de seguridad" de PHP tiene varios problemas:

  1. Cualquier marco o la tecnología de pila puede tener fallos de seguridad. El hecho de que su administrador de sistemas solo permita .Net de manera eficaz bajo protesta sobre Java solo indica un sesgo irracional. Lo digo como un desarrollador de Java desde hace mucho tiempo: Java, .Net y PHP pueden tener fallas de seguridad;
  2. Puede ejecutar PHP desde la línea de comandos para que no sirva ninguna solicitud HTTP, lo que disminuye el problema de fallas de seguridad básicamente a cero;
  3. Si usted está preocupado acerca de las amenazas de seguridad interna (de una persona con acceso a la caja) simplemente restringir el ejecutable PHP CLI sólo para ser ejecutable por un grupo que sólo su programa está en.
+1

Hola, Gracias por la respuesta, desafortunadamente el producto está escrito en C#, simplemente carga archivos a un servidor web pero tenemos que documentar las funciones que se están cargando. No podemos ejecutar PHP localmente, lo cual es una mierda :( –

+1

¿Por qué no puedes ejecutar PHP localmente? No necesitas un servidor web, simplemente alimenta tu script en PHP.exe o lo que sea y captura la salida de la consola en tu aplicación C#. –

+0

Nuestro sysadmin es anal sobre la ejecución de PHP. Si no es Java (y solo-porque-management-tiene-el-final-dice) .NET, no se ejecuta en nuestros cuadros de producción. Le preocupan las fallas de seguridad en PHP. –

1

Usted puede ser capaz de usar ctags para su propósito. No estoy seguro de cómo lo integraría con C# sin embargo, dado que ctags está escrito en C.

Alternativamente, si conoce sus analizadores, puede echar un vistazo a los archivos de gramática en la fuente PHP. En particular, zend_ini_parser.y y zend_language_parser.y.

Por último, aunque no es la mejor solución, podría salirse con la suya con un puñado de expresiones regulares preparadas en casa. La gramática de PHP es bastante estricta con respecto a las clases y funciones. Solo necesita realizar un seguimiento de un poco de estado para saber a qué clase pertenece una función.