Регулярное выражение для чистых javascript-комментариев типа //

Я использую следующий REGEXP:

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

Код работает хорошо, НО !!!!, когда URL-адрес (http://this_is_not_a_comment.com/kickme) , код заменяет его … (http: //)

Что вы можете сделать, чтобы не заменить эти URL-адреса.

Благодаря,

Вам нужно регулярное выражение, которое может различать код и комментарии. В частности, поскольку последовательность // может быть либо в строке, либо в комментарии, вам просто нужно различать строки и комментарии.

Вот пример, который может это сделать:

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

Используя это в функции replace при замене сопоставленной строки совпадением первого подшаблона, следует удалить комментарии стиля // .

Некоторое объяснение:

  • [^/"']+ соответствует любому символу, который не является началом комментария (как //… и /*…*/ ), так и строки
  • /\*(?:[^*]|\*+[^*/])*\*+/ соответствует комментариям /* … */ style
  • "(?:[^"\\]|\\.)*" соответствует строке в двойных кавычках
  • '(?:[^'\\]|\\.)*' соответствует строке в одинарных кавычках
  • \/\/.* наконец, соответствует комментариям стиля //…

Поскольку первые три конструкции сгруппированы в группу захвата, соответствующая строка доступна и ничего не изменяется при замене сопоставленной строки совпадением первого подшаблона. Только если совпадение совпадения совпадения совпадения первого подшаблона пуст и, следовательно, оно заменяется пустой строкой.

Но обратите внимание, что это может потерпеть неудачу. Я не совсем уверен, что он работает для любого ввода.

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