Penso che questo potrebbe funzionare. Se qualcuno vede qualcosa che io non, come una ragione per cui non funzionerà, per favore rispondi.
if\s*\(((?:[^\(\)]|\((?1)\))*+)\)\s*{((?:[^{}]|{(?2)})*+)}
L'unico problema che si dovrebbe verificare ora è se c'è un'istruzione if in un'istruzione if.
Ho provato questo su ogni affermazione valida se posso pensare che potrebbe infrangerlo e l'unica cosa su cui non funziona è uno che contiene una stringa con una parentesi non abbinata.
Aggiornamento: ho trovato un errore con l'espressione regolare precedente. Non cattura se le istruzioni che contengono stringhe con parentesi non corrispondenti nelle loro condizioni o sezioni di istruzioni. Come nell'esempio seguente:
if (var1 == "("){
echo "{";
}
Tuttavia questa è una dichiarazione if valida.La soluzione:
if\s*\(((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^\(\)]|\((?1)\))*+)\)\s*{((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^{}]|{(?2)})*+)}\s*
Questa espressione regolare cattura tutti, se le dichiarazioni anche quelli che contengono stringhe con parentesi senza eguali.
AGGIORNAMENTO: ora ce l'ho in modo da catturare il resto e altro se le istruzioni che sono allegate alle istruzioni if. L'unico problema è che i gruppi di cattura restituiti sono l'ultimo e l'ultimo altro se presente nell'istruzione if. Spero di riuscire a capire come aggirare anche quello.
if\s*\(((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^\(\)]|\((?1)\))*+)\)\s*{((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^{}]|{(?2)})*+)}\s*(?:(?:else\s*{((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^{}]|{(?3)})*+)}\s*)|(?:else\s*if\s*\(((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^\(\)]|\((?4)\))*+)\)\s*{((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^{}]|{(?5)})*+)}\s*))*;
Se volete provarlo, ecco un grande sito per esso: http://gskinner.com/RegExr/
@Koukaakiva - La correzione dei posti per gli errori di ortografia è un comune qui su SO. Le FAQ contengono maggiori dettagli su questa pratica. http://stackoverflow.com/faq –