【问题标题】:Matching all three kinds of PHP comments with a regular expression用正则表达式匹配所有三种 PHP 注释
【发布时间】:2012-10-18 07:45:38
【问题描述】:

我是 REGEX 的新手,需要一些帮助。

我需要匹配 PHP 可能拥有的所有三种类型的 cmets:
# Single line comment
// Single line comment
/* Multi-line comments */

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

我应该提一下,我这样做是为了能够识别 PHP 结束标记 (?>) 是否在评论中,如果是则忽略它,如果不是则将其计为一。这将在 XML 文档中使用,以提高 Sublime Text 对结束标记的识别(因为它让我发疯!)。我尝试了几个小时但没能做到,所以如果你能翻译它以使用 XML,我将不胜感激。 :)

因此,如果您还可以包含 if-then-else 登录信息,我将不胜感激。顺便说一句,我真的需要它是纯正则表达式,没有语言特征或任何东西。 :)

就像 Eicon 提醒我的那样,我需要所有这些都能够在行首或一段代码的末尾匹配,所以我还需要所有这些:

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

任何帮助将不胜感激。 :)

【问题讨论】:

  • 想要也匹配`$var=value; #评论?
  • @eicto 是的,谢谢,我会补充的。
  • @Dagon 那篇文章并没有真正包含我需要的内容,因为我需要它是纯正则表达式,中间没有语言功能。

标签: php regex comments sublimetext2


【解决方案1】:

解析编程语言对于正则表达式来说似乎太多了。您可能应该寻找一个 PHP 解析器。

但这些将是您正在寻找的正则表达式。我假设他们都使用 DOTALL 或 SINGLELINE 选项(尽管前两个在没有它的情况下也可以工作):

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

请注意,如果注释分隔字符出现在字符串或其他地方,它们中的任何一个都会导致问题,而它们实际上并没有打开注释。

您也可以将所有这些组合成一个正则表达式:

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

如果您使用不需要分隔符的工具或语言(如 Java 或 C#),请删除那些 ~。在这种情况下,您还必须以不同的方式应用 DOTALL 选项。但是不知道你将在哪里使用它,我无法告诉你如何使用。

如果您不能/不想设置 DOTALL 选项,这将是等效的(我还省略了分隔符来举例说明):

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

See here 用于工作演示。

现在,如果您还想捕获组中 cmets 的内容,那么您可以这样做

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

无论注释的类型如何,cmets 内容(没有语法分隔符)都将在捕获 1 中找到。

另一个working demo。

【讨论】:

  • 这将在 XML 文档中使用,以提高 Sublime Text 对结束标记的识别(因为它让我发疯!)。我试图用几个小时来实现这一点,但没能做到,所以如果你能把它翻译成正确的语言,我将不胜感激。 :)
  • 对不起,我不熟悉你的正则表达式风格。但这将是等效的,无需您设置 DOTALL 选项(如果您不需要分隔符):(?:#|//)[^\r\n]*|/\*[\s\S]*?\*/
  • @EduardoLávaque 我将其与工作演示一起编辑到问题中。
  • 谢谢!这是一个很好的起点。 :) 编辑:好的,谢谢! :) EDIT2:不适用于我需要的东西,但这是一个很好的起点。 :)
【解决方案2】:

老问题,但也许这对其他人有帮助...

单行cmets

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

使用此正则表达式,您必须替换(或删除)((?:#|\/\/).*$) 捕获的所有内容。此正则表达式将忽略看起来像 cmets 的字符串内容(例如 $x = "You are the #1"; 或 $y = "You can start comments with // or # in PHP, but I'm a code string";)

多行 cmets

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

【讨论】:

    猜你喜欢
    • 2017-05-22
    • 2010-11-14
    • 2012-10-26
    • 2012-12-31
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 2013-04-02
    • 2015-03-04
    相关资源
    最近更新 更多