Uma das linhas do meu script contém uma tag de fechamento do PHP dentro de uma string. Sob operação normal, isso não causa problemas, mas preciso comentar a linha.
Tentei comentar esta linha com //
, /*
*/
e #
mas nenhum deles trabalho, o analisador considera fechando tag para ser um tag de encerramento efectivo.
Aqui está a linha em questão:
$string = preg_replace('#<br\s*/?>(?:\s*<br\s*/?>)+#i', '<br />', $string);
// ^^ ^^
O que posso fazer para comentar a linha acima?
<?php # echo 'simple';?>
.Respostas:
Use um truque: concatene a corda de duas peças. Dessa forma, a tag de fechamento é cortada em duas e não é mais uma tag de fechamento válida.
'?>' --> '?'.'>'
No seu código:
Isso fará com que os
//
comentários funcionem.Para que os
/* */
comentários funcionem, você também precisará dividir a*/
sequência:Lembre-se, às vezes, mesmo que o todo seja mais do que a soma de suas partes - mas ser ganancioso é ruim, há momentos em que é melhor você ficar com menos . :)
fonte
??<
A maneira mais fácil
Crie uma variável separada para manter sua expressão regular; Dessa forma, você pode simplesmente comentar a
preg_replace()
declaração:Corrigir usando classes de caracteres
Para corrigir comentários de linha, você pode terminar
?>
colocando>
uma classe de caractere assim:Para corrigir comentários em bloco, você pode aplicá-lo a
/
:Para corrigir os dois estilos de comentários, você pode colocar
/
e>
em sua própria classe de caracteres.Corrigir usando o
/x
modificadorO
x
modificador - akaPCRE_EXTENDED
- ignora espaços e novas linhas em uma expressão regular (exceto quando ocorrem dentro de uma classe de caracteres); isso torna possível adicionar espaços para separar os caracteres problemáticos. Para corrigir os dois estilos de comentário:fonte
x
modificador :)g
) ...Por que suas tentativas não funcionaram:
O que funciona:
Mais distante...
Após o exposto, você poderá usar
/*
para comentar a linha. Se você deixar?>
intacto,//
não poderá comentar uma linha inteira. O texto a seguir?>
pode ser html, que está fora do controle do interpretador PHP, para que não funcione.A partir da documentação:
fonte
Outra idéia: escape do
>
(e do/
, se você quiser usar um/*...*/
comentário):Uma fuga "desnecessária" é ignorada pelo mecanismo regex, mas é útil neste caso (por razões descritas nas outras respostas).
fonte
Por que usar "truques" complicados e difíceis de ler para solucionar o problema?
?
é apenas um atalho de quantificador por conveniência, entãoBasta usar a versão longa do quantificador
{0,1}
, significa "mínimo 0 máximo 1 ocorrência":fonte
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:#(<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!\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:
1. Use um nowdoc :
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 :
Exemplo ao vivo: http://codepad.viper-7.com/UfqrIQ
3. Passe o mouse sobre o código com
if(false)
ouif(0)
:Teste: http://codepad.viper-7.com/wDg5H5
fonte