我需要匹配 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/