2009-09-16 12 views
7

Ho un requisito per l'analisi dei file PHP in C#. Essenzialmente, alcuni sviluppatori necessitano di caricare file PHP e, una volta caricati, controllare i file php e ottenere un elenco di tutti i metodi, classi, funzioni, ecc.Analisi rapida di PHP in C#

Ho pensato di usare una regex ma io non posso allenarmi se una funzione appartiene a una classe etc, quindi mi chiedevo se c'è già qualcosa di "fuori là" che analizzerà i file PHP e sputerà le sue funzioni (sto cercando di evitare di scrivere un'implementazione AST di colpo completo) .

Qualcuno ha qualche idea? Ho guardato Coco/R ma non sono riuscito a trovare un file di grammatica PHP. Sto usando .NET 2.0 e C#.

risposta

18

Perché farlo in C#? In PHP questo è banale da fare. Utilizzare la funzione token_get_all() e romperà un file PHP in un flusso di lessemi che è possibile utilizzare per determinare definitivamente l'elenco di classi e metodi scrivendo una macchina a stati finiti.

Qualsiasi cosa tu faccia, non provare a farlo con le espressioni regolari. Sarà incredibilmente noioso e soggetto a errori.

Edit: Ci sono tre possibilità di base per fare questo:

  1. Farlo in PHP. Questa sarà l'opzione più veloce (da sviluppare) e più semplice;
  2. Eseguire uno script PHP da riga di comando per eseguire questa operazione o generare una serie di token che possono essere interpretati da un programma C#. Questo è il prossimo più facile;
  3. Utilizzare Phalanger, una porta di PHP nel framework .Net. Questo potrebbe essere più gradito alla gestione poiché è ancora tutto il codice .Net; oppure
  4. Utilizzare Quercus, una porta di PHP nella VM Java.

Tutto il resto coinvolgerà sia scrivendo un parser PHP (un sacco di lavoro) o utilizzando le espressioni regolari davvero traballante che sarà un incubo supporto inaffidabile.

di essere preoccupato per presunti "problemi di sicurezza" di PHP ha diversi problemi:

  1. Ogni quadro o stack tecnologico può avere falle di sicurezza. Il fatto che il tuo sysadmin permetta solo .Net in modo efficace sotto protesta su Java indica semplicemente pregiudizi irrazionali. Dico questo come uno sviluppatore Java di lunga data: Java, .Net e PHP possono avere tutti i difetti di sicurezza;
  2. È possibile eseguire PHP dalla riga di comando in modo che non serva alcuna richiesta HTTP, il che riduce sostanzialmente a zero il problema dei difetti di sicurezza;
  3. Se siete preoccupati per le minacce alla sicurezza interna (da qualcuno che ha accesso alla scatola) è sufficiente limitare il PHP CLI eseguibile per essere eseguibile solo da un gruppo che solo il vostro programma è in.
+1

Ciao, Grazie per la risposta, sfortunatamente il prodotto è scritto in C#, basta caricare i file su un server web ma dobbiamo documentare le funzioni caricate. Non è possibile eseguire PHP localmente o quale motivo :( –

+1

perché non è possibile eseguire PHP localmente? Non è necessario il server web, basta inserire il proprio script in PHP.exe o qualunque esso sia e acquisire l'output della console nell'applicazione C#. –

+0

Il nostro sysadmin è anonimo sull'esecuzione di PHP, se non è Java (e solo-perché-gestione-ha-la-finale-dire) .NET, non funziona sulle nostre scatole di produzione.Essa è preoccupato per i difetti di sicurezza in PHP. –

1

Si potrebbe essere in grado di utilizzare ctags per il tuo scopo. Non sono sicuro di come lo si integri con C#, dato che ctags è scritto in C.

In alternativa, se si conosce il parser, è possibile dare un'occhiata ai file di grammatica nel sorgente PHP. In particolare zend_ini_parser.y e zend_language_parser.y.

Infine, anche se non è la soluzione migliore, è possibile che riesca a scappare con una manciata fatta in casa di espressioni regolari. La grammatica di PHP è abbastanza rigida per quanto riguarda le classi e le funzioni. Hai solo bisogno di tenere traccia di un po 'di stato, quindi sai a quale classe appartiene una funzione.