Я думаю, это может сработать. Если кто-то видит что-то, чего я не вижу, например, причина, по которой это не сработает, пожалуйста, ответьте.
if\s*\(((?:[^\(\)]|\((?1)\))*+)\)\s*{((?:[^{}]|{(?2)})*+)}
Единственная проблема, с которой следует столкнуться сейчас, - это если в операторе if есть оператор if.
Я проверял это на каждом действительном операторе if, который мог придумать, который мог бы его сломать, и единственное, на чем он не работает, это тот, который содержит строку с непревзойденными скобками.
Обновление: я обнаружил ошибку с указанным выше регулярным выражением. Он не перехватывает операторы if, которые содержат строки с несоответствующими круглыми скобками в их разделах условия или оператора. Как в следующем примере:
if (var1 == "("){
echo "{";
}
Однако это допустимое утверждение if. Решение:
if\s*\(((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^\(\)]|\((?1)\))*+)\)\s*{((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^{}]|{(?2)})*+)}\s*
Это регулярное выражение захватывает все операторы if, даже те, которые содержат строки с непрописанными скобками.
ОБНОВЛЕНИЕ: у меня теперь есть, чтобы он захватывал операторы else и else if, которые прикреплены к операторам if. Единственная проблема состоит в том, что возвращаемые им группы захвата являются последними и последними, если в операторе if. Надеюсь, я разберусь, как обойти это.
if\s*\(((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^\(\)]|\((?1)\))*+)\)\s*{((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^{}]|{(?2)})*+)}\s*(?:(?:else\s*{((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^{}]|{(?3)})*+)}\s*)|(?:else\s*if\s*\(((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^\(\)]|\((?4)\))*+)\)\s*{((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^{}]|{(?5)})*+)}\s*))*;
Если вы хотите проверить это, вот отличный сайт для этого:
http://gskinner.com/RegExr/