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

Posted

技术标签:

【中文标题】用正则表达式匹配所有三种 PHP 注释【英文标题】:Matching all three kinds of PHP comments with a regular expression 【发布时间】: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 那篇文章并没有真正包含我需要的内容,因为我需要它是纯正则表达式,中间没有语言功能。 【参考方案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

【讨论】:

以上是关于用正则表达式匹配所有三种 PHP 注释的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配 MySQL 注释

php 正则表达式 匹配网站内容

正则表达式匹配所有注释 //, /* */

(php) 正则表达式删除注释但忽略字符串中的出现

正则表达式匹配注释(单行或多行)并匹配其他所有内容(C#)

php 中文标点逗号‘,’怎么用正则匹配