Согласование всех трех видов комментариев PHP с REGEX

Я новичок в REGEX, и мне нужна помощь.

Мне нужно сопоставить все три типа комментариев, которые могут иметь PHP:
# Single line comment
// Single line comment
/* Multi-line comments */

 /** * And all of it's possible variations */ 

Что-то, о чем я должен упомянуть, я делаю это, чтобы узнать, есть ли закрывающий тег PHP ( ?> ) Внутри комментария или нет, если он затем игнорирует его, если нет, то заставляйте его считать одним. Это будет использоваться внутри XML-документа, чтобы улучшить распознавание Sublime Text закрывающего тега (потому что это заставляет меня гать!). Я пытался это сделать пару часов, но не смог, поэтому, если бы вы могли перевести его на работу с XML, я был бы признателен. 🙂

Поэтому, если вы также можете включить логин if-then-else, я бы очень признателен. BTW, мне действительно нужно, чтобы он был в чистом выражении REGEX, каких-либо языковых функций или чего-то еще. 🙂

Как мне напоминал Eicon, мне нужно, чтобы все они были в состоянии совпадать в начале строки или в конце фрагмента кода, поэтому мне также нужно следующее со всеми из них:

 <?php echo 'something'; # this is a comment ?> 

Любая помощь будет оценена по достоинству. 🙂

Solutions Collecting From Web of "Согласование всех трех видов комментариев PHP с REGEX"

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

Но это будут регулярные выражения, которые вы ищете. Я полагаю для всех, что вы используете опцию DOTALL или SINGLELINE (хотя первые два будут работать и без нее):

 ~#[^\r\n]*~ ~//[^\r\n]*~ ~/\*.*?\*/~s 

Обратите внимание, что любой из них вызовет проблемы, если символы с разделителями комментария отображаются в строке или где-то еще, где они фактически не открывают комментарий.

Вы также можете объединить все это в одно регулярное выражение:

 ~(?:#|//)[^\r\n]*|/\*.*?\*/~s 

Если вы используете какой-либо инструмент или язык, который не требует разделителей (например, Java или C #), удалите их. В этом случае вам также придется применять опцию DOTALL по-разному. Но не зная, где вы собираетесь это использовать, я не могу сказать вам, как это сделать.

Если вы не можете / не хотите устанавливать опцию DOTALL, это было бы эквивалентно (я также оставил разделители, чтобы привести пример):

 (?:#|//)[^\r\n]*|/\*[\s\S]*?\*/ 

См. Здесь рабочую демонстрацию.

Теперь, если вы также хотите зафиксировать содержимое комментариев в группе, вы можете сделать это

 (?|(?:#|//)([^\r\n]*)|/\*([\s\S]*?)\*/) 

Независимо от типа комментария содержимое комментариев (без разделителей синтаксиса) будет найдено в блоке 1.

Еще одна рабочая демонстрация .

Старый вопрос, но, возможно, это поможет кому-то еще …

Комментарии к одной строке

 singleLineComment = /'[^']*'|"[^"]*"|((?:#|\/\/).*$)/gm 

С этим регулярным выражением вы должны заменить (или удалить) все, что было захвачено ((?:#|\/\/).*$) . Это регулярное выражение будет игнорировать содержимое строк, которые будут выглядеть как комментарии (например, $x = "You are the #1"; или $y = "You can start comments with // or # in PHP, but I'm a code string"; )

Многострочные комментарии

  multilineComment = /^\s*\/\*\*?[^!][.\s\t\S\n\r]*?\*\//gm