preg_match_all 排除 PHP 个预定义方法

preg_match_all exclude PHP predefined methods

我正在使用 PHP 将控制器名称加载到 table 中,并将其 public 方法的名称加载到另一个 table 中。我想排除任何 PHP 魔术方法,因为它们实际上 public 不可用。

正在读取的文件内容是...

class Dashboard extends MY_Controller {

  public function __construct()
  {
    parent::__construct();
  }

  public function index()
  {
    $this->has_access() ;
  }
}

我正在使用以下正则表达式来排除以 __ 开头的方法,因为它通常表示魔术方法

preg_match_all('/^\s*public\s+function\s+(?<!__)(\w.*)\b/Uim', file_get_contents('Dashboard.php', $public_methods, PREG_PATTERN_ORDER) ;

我期望的是,从行首到并包括文本 "function" 之后的最后一个 space 字符的所有文本都将被丢弃,最后一个 space 直到下一个单词(方法名称)结束的字符将被包括在内,除非方法名称以 __ 开头,在这种情况下将没有匹配项。

我得到的是..

Array
(
  [0] => Array
      (
          [0] =>  function __construct
          [1] =>  function index
      )

  [1] => Array
      (
          [0] => __construct
          [1] => index
      )
)

我不要的是里面有__construct的元素

我试过了

我认输求助,我需要对正则表达式做些什么来排除以__开头的方法?

TIA

简介

您不应该使用正则表达式来解析不是常规语言的东西,但是无论如何,这就是您要找的...

您的模式无效,因为您使用了 (?<!__),这是一种消极的回顾。您需要使用前瞻,因为 \s+(?<!__) 将始终 return 为真(\s+ 不能包含 __ 并且因为它是 lookbehind 它在当前位置后面查找) . lookahead 将向前看(因此得名)。将 (?<!__) 更改为 (?!__) 会起作用,但我已经为您的模式添加了一个很好的 \K 重置标记。请参阅 代码 部分。


代码

See regex in use here

^\s*public\s+function\s+(?!__)\K\w+\b

说明

我只会解释我改变了什么:

  • (?!__) 确保后面的内容与 __ 字面意思不符。您也可以将其替换为 (?!_{2}),以获得 非常轻微的 性能提升。
  • \K 重置报告匹配的起点。任何先前消耗的字符不再包含在最终匹配中。