正则表达式 - 排除被注释的 PHP 代码块

5
我正在使用一个文件搜索工具(FileSeek),它支持正则表达式内容搜索。我要搜索的内容基本上是任何没有被注释的带有while...each的行。我已经成功地通过这个正则表达式排除了内联注释行,例如// while (list($key, $value) = each($_GET)): ^(?:(?!\/\/).)*while.+[\s=(]each[\s(] 演示 如何改进正则表达式搜索(使其更加严格),以便从注释行和注释代码块中排除搜索结果,例如\* *\
/*
  while (list($key, $value) = each($_GET))
*/

或者

/* some code
  while (list($key, $value) = each($_GET))
  some code
*/

换句话说,我如何修改我的正则表达式以完全跳过/忽略在注释的php块内部的所有内容:\* *\,而不是捕获也在其中的结果? 编辑: 仅供参考,这里是一个相反的示例,即仅匹配已注释的代码。

你可以修改现有的表达式,使用交替并仅捕获未匹配的内容。请参见此处 - Paolo
1
@UnbearableLightness 谢谢。我正在寻找一种比我在问题中已发布的正则表达式更严格的解决方案,目前该正则表达式会选择注释代码块中的 while...each 部分:https://regex101.com/r/pCQ3QC/1/ - Nikita 웃
1个回答

2

如果你的工具支持,你可以使用 (*SKIP)(*FAIL) 来跳过部分内容,再加上 这个技巧

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

在 regex101 上查看演示。这只是一个快速尝试,您需要根据自己的需求调整模式。


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

^(?:(?!\/\/).)*while.+[\s=(]each[\s(](?!(?:(?!\/\*)[\S\s])*?\*\/)

开启多行模式m和关闭单行模式s

在regex101上的另一个演示


或者没有任何标志,并使用[^\n]代替\N以实现兼容性。

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

One more demo at regex101


谢谢。这个工具似乎不支持那个。还有其他方法吗? - Nikita 웃
或许可以使用内联修饰符,你可以像这样使用更新后的正则表达式吗? - bobble bubble
当我尝试使用您演示的确切正则表达式时,很遗憾它显示“RegEx模式无效”。虽然它在其他引擎中运行良好,但是在这个工具中不行。可能不接受SKIP、F。有什么替代方案吗? - Nikita 웃
1
好像FileSeek不支持m多行匹配,但是这个工具https://sourceforge.net/projects/grepwin/支持,并且似乎可以很好地与你的正则表达式配合使用,所以再次感谢! - Nikita 웃
1
@CM웃 欢迎,我想到了 m,因为你的模式使用了 ^ 表示行开头。Fileseek 似乎使用了 C# 的正则表达式风格。如果没有任何标志,我能想到的最后一个想法是 (?<![^\n])(?:(?!\/\/)[^\r\n])*while[^\r\n]+[\s=(]each[\s(](?!(?:(?!\/\*)[\S\s])*?\*\/)。很棒,你已经搞定了 :) 当然很高兴你喜欢我的昵称 (: - bobble bubble
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接