Creo que esto puede funcionar. Si alguien ve algo que yo no veo, como una razón por la que no funcionará, por favor responde.
if\s*\(((?:[^\(\)]|\((?1)\))*+)\)\s*{((?:[^{}]|{(?2)})*+)}
El único problema que esto debería encontrar ahora es si hay una instrucción if en una instrucción if.
He probado esto en cada sentencia if válida que puedo pensar que podría romperla y lo único que no funciona es una que contiene una cadena con un paréntesis sin igual.
Actualización: Encontré un error con la expresión regular anterior. No detecta si las instrucciones que contienen cadenas con paréntesis no coincidentes en sus secciones de condición o enunciado. Como en el siguiente ejemplo:
if (var1 == "("){
echo "{";
}
Sin embargo, esta es una declaración if válida.La solución:
if\s*\(((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^\(\)]|\((?1)\))*+)\)\s*{((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^{}]|{(?2)})*+)}\s*
Esta expresión regular captura todo si las declaraciones incluso los que contienen cadenas con paréntesis sin igual.
ACTUALIZACIÓN: Ahora lo tengo para que se capture el else y si las declaraciones que se adjuntan a las declaraciones if. El único problema es que los grupos de captura que devuelve son el último y el último si está en la instrucción if. Espero poder resolverlo también.
if\s*\(((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^\(\)]|\((?1)\))*+)\)\s*{((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^{}]|{(?2)})*+)}\s*(?:(?:else\s*{((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^{}]|{(?3)})*+)}\s*)|(?:else\s*if\s*\(((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^\(\)]|\((?4)\))*+)\)\s*{((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^{}]|{(?5)})*+)}\s*))*;
Si desea probarlo, aquí hay un gran sitio web para ello: http://gskinner.com/RegExr/
@Koukaakiva - La corrección de los mensajes de errores de ortografía es un campo común aquí en la SO. Las preguntas frecuentes tienen más detalles sobre esta práctica. http://stackoverflow.com/faq –