Expression régulière pour les commentaires javascript propres du type //

J'utilise le REGEXP suivant:

$output = preg_replace( "/\/\/(.*)\\n/", "", $output ); 

Le code fonctionne bien MAIS !!!!, quand une URL comme (http://this_is_not_a_comment.com/kickme) , le code le remplace … (http: //)

Que pouvez-vous faire pour ne pas remplacer ces URL.

Merci,

Vous avez besoin d'une expression régulière qui peut distinguer le code et les commentaires. En particulier, puisque la séquence de // peut être dans une chaîne ou un commentaire, il suffit de distinguer les chaînes et les commentaires.

Voici un exemple qui pourrait faire ceci:

 /(?:([^\/"']+|\/\*(?:[^*]|\*+[^*\/])*\*+\/|"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')|\/\/.*)/ 

L'utilisation de cette fonction dans une fonction de remplacement lors du remplacement de la chaîne associée avec la correspondance du premier sous-filtre devrait pouvoir supprimer les // commentaires de style.

Quelques explications:

  • [^/"']+ Correspond à n'importe quel caractère qui n'est pas le début d'un commentaire (à la fois //… et /*…*/ ) ou d'une chaîne
  • /\*(?:[^*]|\*+[^*/])*\*+/ Correspond aux commentaires /* … */ style
  • "(?:[^"\\]|\\.)*" Correspond à une chaîne entre guillemets
  • '(?:[^'\\]|\\.)*' Correspond à une chaîne à guichet unique
  • \/\/.* correspond finalement aux //… commentaires de style.

Comme les trois premières constructions sont regroupées dans un groupe de capture, la chaîne correspondante est disponible et rien n'est modifié lors du remplacement de la chaîne associée par la correspondance du premier sous-modèle. Seulement si un //… commentaire de style est assorti, la correspondance du premier sous-filtre est vide et donc remplacée par une chaîne vide.

Mais notez que cela pourrait échouer. Je ne sais pas si cela fonctionne pour toute contribution.

 $output = preg_replace( "/(?<!\:)\/\/(.*)\\n/", "", $output );