用正则表达式匹配所有三种 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 注释的主要内容,如果未能解决你的问题,请参考以下文章