Vale a pena acrescentar algumas outras maneiras ao livro de truques RegEx :
Primeiro você pode compactar seu RegEx para: /(<br\s*/?>)+/i
e substituir por<br />
(não é necessário sobrecarregar o RegExP com olhais) e você sempre terminará com a quebra de linha XHMTL escolhida.
Outras maneiras de modificar o seu RegEx para que ele não tropeça no */
comentário ?>
final ou no script final:
- Use quantificadores possessivos :
#(<br\s*+/?+>)+#i
- o que significa basicamente \s*+
se você encontrou espaço em branco igual a tantos quantos existem e o mantém, e /?+
se você encontrou uma barra, mantenha-o!
- Coloque
\s*
e /*
em grupos de captura =>#(<br(\s*)(/?)>)+#i
Demonstrações ao vivo: http://codepad.viper-7.com/YjqUbi
E, como adotamos o comportamento possessivo, o RegEx mais rápido, que também contorna o problema dos comentários, é: demonstração explicada#(<br\s*+/?+>)++#i
Quanto a comentar em situações difíceis
Quando você não pode alterar o código ou já usou um comentário de várias linhas e:
$string='Hello<br>World<br><br />World<br><br><br>Word!';
<<<'comment'
$string = preg_replace('#(<br\s*/?>)+#i', '<br />', $string);
comment;
Código ao vivo: http://codepad.viper-7.com/22uOtV
Nota: um nowdoc é semelhante a um heredoc, mas não analisa o conteúdo e deve incluir o delimitador inicial entre '
aspas simples '
( observe que o delimitador final não pode ser identificado , deve ser seguido por ;
uma nova linha ! )
2. Pule o código com um goto :
$string='Hello<br>World<br><br />World<br><br><br>Word!';
goto landing;
$string = preg_replace('#(<br\s*/?>)+#i', '<br />', $string);
landing:
Exemplo ao vivo: http://codepad.viper-7.com/UfqrIQ
3. Passe o mouse sobre o código com if(false)
ou if(0)
:
$string='Hello<br>World<br><br />World<br><br><br>Word!';
if(0){
$string = preg_replace('#(<br\s*/?>)+#i', '<br />', $string);
}
Teste: http://codepad.viper-7.com/wDg5H5