Eliminando comentários em HTML com o PHP, mas deixando condicionais

Atualmente, estou usando o PHP e uma expressão regular para remover todos os comentários HTML de uma página. O script funciona bem … um pouco muito bem. Ele exclui todos os comentários, incluindo meus comentários condicionais no. Aqui está o que eu tenho:

<?php function callback($buffer) { return preg_replace('//', '', $buffer); } ob_start("callback"); ?> ... HTML source goes here ...  

Uma vez que minha regex não é muito quente, estou tendo problemas para tentar descobrir como modificar o padrão para excluir comentários condicionais, como:

   <!--    

Felicidades

Como os comentários não podem ser nesteds em HTML, um regex pode fazer o trabalho, em teoria. Ainda assim, usar algum tipo de analisador seria a melhor escolha, especialmente se sua input não for garantida para ser bem formada.

Aqui está a minha tentativa. Para combinar apenas comentários normais, isso funcionaria. Tornou-se bastante um monstro, desculpe por isso. Testei-o bastante, parece fazê-lo bem, mas não dou nenhuma garantia.

 ).)*--> 

Explicação:

 ) #11: a position not followed by "-->" . #12: eat the following char, it's part of the comment )* #13: end non-capturing group, repeat --> #14: "-->" 

As etapas # 02 e # 11 são cruciais. # 02 garante que os seguintes caracteres não indicam um comentário condicional. Depois disso, # 11 garante que os seguintes caracteres não indicam o final do comentário, enquanto os # 12 e # 13 causam a correspondência real.

Aplicar com os sinalizadores “global” e “dotall”.

Para fazer o contrário (emparelhar apenas comentários condicionais), seria algo assim:

 ).)* 

Explicação:

  #06: "" or "" (depends on #02) ) #07: end of look-ahead . #08: eat the following char, it's part of the comment )* #09: end of non-capturing group, repeat  #10: "" or "" (depends on #02) 

Novamente, aplique com os sinalizadores “global” e “dotall”.

O passo 02 é devido à syntax “downlevel-revelado”, veja: “MSDN – Sobre Comentários Condicionais” .

Não tenho certeza de onde os espaços são permitidos ou esperados. Adicione \s* à expressão onde apropriado.

Se você não consegue trabalhar com uma expressão regular ou achar que deseja preservar mais comentários, você pode usar preg_replace_callback . Você pode então definir uma function para lidar com os comentários individualmente.

 /U', 'comment_replace_func', $buffer); } function comment_replace_func($m) { if (preg_match( '/^\<\!--\[if \!/i', $m[0])) { return $m[0]; } return ''; } ob_start("callback"); ?> ... HTML source goes here ...  

Em resumo, esta parece ser a melhor solução:

 /', '', $buffer); } ob_start("callback"); ?> ... HTML source goes here ...  

Ele tira todos os comentários e deixa os condicionais com a exceção do topo:

    

onde o adicional parece estar causando o problema.

Se alguém pode sugerir a regex, que levaria isso em consideração e deixaria isso em prática também, então isso seria perfeito.

A solução de Tomalak parece ser boa, mas como iniciante e sem outras diretrizes, não sei como implementá-la, embora eu gostaria de tentar se alguém puder elaborar sobre como aplicá-la?

obrigado

Não tenho certeza se o mecanismo de regex do PHP gostará do seguinte, mas tente este padrão:

 '//' 

Algo assim pode funcionar:

 // 

É o mesmo que o seu, exceto que ignora os comentários, tem um suporte de abertura imediatamente após a etiqueta de início do comentário.

    Intereting Posts