【问题标题】:PHP Regex negative look behind assertion, preg_replace_callbackPHP Regex 否定看断言,preg_replace_callback
【发布时间】:2012-03-28 21:21:44
【问题描述】:

我正在编写一个脚本,用于循环遍历 PHP 文件并在必要时重命名函数调用。这种选择需要遵循以下规则:

  • 没有函数声明 //function test() {
  • 没有静态函数 //SomeClass::staticMethod()
  • 没有类函数 // $class->method()
  • 仅函数调用 // myFunction()

目前我有以下正则表达式:

preg_replace_callback("/((?<=function\s|\:\:|->)[a-z][a-zA-Z0-9\_]+)\(.*\)/i", 'test', $content);
  • 函数名称大多以驼峰表示法编写。
  • 有时函数名称包含下划线。

这是断言背后的积极看法:它给出了所有被 NO 分类的给定规则 :)

所以我必须以消极的方式改变它,但这是我的问题。当我尝试时,它没有按建议工作。

编辑

当我尝试否定断言背后的看法时

'?&lt;!' instead of '?&lt;='

上面的例子给出了以下输出:

  • est()(先丢失)
  • taticMethod()(先丢失)
  • ethod()(先丢失)
  • myFunction()(正确)

它删除了我不想匹配的函数的第一个字母。有谁知道怎么做的吗?

【问题讨论】:

  • 什么不符合建议?
  • 当我在上面的示例中尝试对断言('?

标签: php regex


【解决方案1】:

您似乎放错了括号。您当前的正则表达式似乎删除了驼峰式函数的第一个字符。这似乎效果更好(使用preg_match_all 测试):

preg_match_all("/(?<=function\s|\:\:|->)([a-z][a-zA-Z0-9\_]+)\(.*\)/i", $file, $matches);

附带说明,您使用 preg_replace_callback 是不正确的,因为它的第二个参数应该是 callable

编辑

根据 PO 的评论,我的第一次尝试是愚蠢的 :)

您的表达式的主要问题是,如果它以:: 开头,它将删除这部分,但方法名称的第一个字母将匹配您的第一个子表达式,其余部分将作为方法名称匹配。

我尝试了另一种使用字符组的方法,让我知道它对你的效果如何:

preg_match_all('/[^:a-z]([a-z]+[a-zA-Z0-9\_]+)\(.*\)[^\s{]/i', $file, $matches);

【讨论】:

  • 感谢您的改进,但这里无法正常工作。你的正则表达式给了我规则:“NO function declaration //function test()”,但我想要以下规则:“ONLY function calls // myFunction()”在你的旁注:我使用第二个参数作为参考。
  • 是的,抱歉。现在编辑我的答案
  • 我实现了你的正则表达式,它看起来很完美,谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-02-23
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
相关资源
最近更新 更多