php - 用正则表达式匹配所有三种 PHP 注释

标签 php regex comments sublimetext2

我需要匹配 PHP 可能拥有的所有三种类型的注释:

  • #单行注释

  • //单行注释

  • /* 多行注释 */

  •  

     /**
      * And all of its possible variations
      */
    

我应该提一下:我这样做是为了能够识别 PHP 结束标记 (?>) 是否在评论中。如果是则忽略它,如果不是则将其计为一。这将在 XML 文档中使用以改进 Sublime Text对结束标签的识别(因为它让我发疯!)。我尝试了几个小时来实现这一目标,但我无法做到。我怎样才能翻译它以使用 XML?

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

就像 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]*?\*/

See here用于工作演示。

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

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

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

另一个 working demo .

关于php - 用正则表达式匹配所有三种 PHP 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13114104/

相关文章:

jquery - Rails AJAX 注释清除文本区域

php - C++ 到 PHP 的翻译

javascript - 仅在刷新页面后更改! (模态 Bootstrap )

python - 如何用特殊字符python替换字符串列表中的精确匹配?

c++ - 仅在 C++ 源文件中查找字符串的正则表达式

emacs - Emacs 中的 C 注释 - Linux 内核风格

javascript - 在不同变量上输出 JavaScript 函数

php - 移动到 SSL 后页面加载后丢失 session

regex - 小于等于运算符 (<=) 的 Scala 正则表达式

wordpress - 如何禁用一个 Wordpress 页面的评论