Я новичок в 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 ?>
Любая помощь будет оценена по достоинству. 🙂
Разбор языка программирования кажется слишком большим для регулярных выражений. Вероятно, вам следует искать парсер 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