RegEx - 排除注释的PHP代码块

Nik*_*a 웃 5 php regex search

我正在使用带有正则表达式内容搜索的文件搜索实用程序(FileSeek).我正在搜索的内容基本上是其中包含的任何未注释的行while...each.我已成功设法排除内联注释行,例如// while (list($key, $value) = each($_GET))使用此正则表达式:^(?:(?!\/\/).)*while.+[\s=(]each[\s(]

演示

如何改进正则表达式搜索(使其更具限制性),以从注释行注释代码块中排除搜索结果,\* *\例如:

/*
  while (list($key, $value) = each($_GET))
*/
Run Code Online (Sandbox Code Playgroud)

要么

/* some code
  while (list($key, $value) = each($_GET))
  some code
*/
Run Code Online (Sandbox Code Playgroud)

换句话说,如何修改我的正则表达式以完全跳过/忽略注释的php块中的所有内容:\* *\而不是拾取其中的结果?

编辑: 仅供参考,这是一个相反的例子,即.仅匹配已注释的代码.

bob*_*ble 2

如果您的工具支持,您可以使用此技巧(*SKIP)(*FAIL)来跳过部分。

(?:(?<!:)\/\/.*|\/\*[\s\S]*?\*\/)(*SKIP)(*F)|while.+?[\s=(]each[\s(]
Run Code Online (Sandbox Code Playgroud)

请参阅 regex101 上的演示。这只是一个快速尝试,您需要根据您的需要调整模式。


如果您的工具不支持此功能,您可以尝试向模式中添加另一个前瞻。

^(?:(?!\/\/).)*while.+[\s=(]each[\s(](?!(?:(?!\/\*)[\S\s])*?\*\/)
Run Code Online (Sandbox Code Playgroud)

打开m多行模式并s关闭单行模式。

regex101 的另一个演示


或者没有任何标志并使用[^\n]而不是\N为了兼容性。

(?<![^\n])(?:(?!\/\/)[^\r\n])*?while[^\r\n]+[\s=(]each[\s(](?!(?:(?!\/\*)[\S\s])*?\*\/)
Run Code Online (Sandbox Code Playgroud)

regex101 上的另一个演示