Регулярное выражение для чистых комментариев JavaScript типа // - PullRequest
1 голос
/ 25 ноября 2010

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

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

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

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

Спасибо

Ответы [ 2 ]

8 голосов
/ 25 ноября 2010

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

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

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

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

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

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

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

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

4 голосов
/ 25 ноября 2010
$output = preg_replace( "/(?<!\:)\/\/(.*)\\n/", "", $output );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...