Escrevi uma regex para substituir short tags do PHP, a única coisa diferente da maioria que eu encontrei foi que me preocupei em manter as quebras de linhas – e não quebrar nenhuma parte do código comendo caracter (encontrei várias sugestões com regex que acabam “comendo” caracter dependendo do caso).
A expressão regular (regex):
<\?([^p|=])
O replace:
<?php $1
Explicando a REGEX:
Ela irá buscar por qualquer <? que não seja seguido imediatemente por um “p”, garantindo que <?php não case com a regex, ou seguido por um “=” – garantindo que <?= não case com a regex.
Os parêntesis da REGEX criam um grupo de captura que é utilizado no replace, isto serve para casos específicos como
<?if(
O i seria “engolido” neste caso. O grupo de captura também captura quebras de linha, isso garante que:
<?
if($x = $y)
Se transforme em:
<?php
if($x = $y)
E não em:
<?php if($x = $y)
Mantendo a mesma legibilidade e formatação do código original após o replace.
Não encontrei nenhuma situação em que esta regex causou problema, se ela não funcionar em algum caso comente aí.