preg_match_all排除PHP预定义方法

时间:2018-01-05 18:58:58

标签: php regex regex-negation

我使用PHP将控制器名称加载到表中,并将其公共方法的名称加载到另一个表中。我想排除任何PHP魔术方法,因为它们不是真正公开的。

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

function findRandomInInterval(min, max, step) {
  var fits = []
  for (var i = min; i < max; i += step) {
    fits.push(i)
  }
  console.log(fits[Math.floor(Math.random() * fits.length)]);
}

findRandomInInterval(0, 10, 4)

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

class Dashboard extends MY_Controller {

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

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

我期待的是,从行首开始到包括文本“function”之后的最后一个空格字符的所有文本都将被丢弃,最后一个空格字符后面的文本将直到下一个单词的结尾(方法名称)将包含在方法名称以__开头的情况下,在这种情况下将不会匹配。

我得到的是......

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

我不想要的是包含Array ( [0] => Array ( [0] => function __construct [1] => function index ) [1] => Array ( [0] => __construct [1] => index ) ) 的元素。

我试过

  • 将初始\ w更改为\ b,这是一场灾难,没有找到方法名称
  • 将\ w的位置改为(。*)以外的效果不佳
  • __construct(?<!__)
  • 的组合

我承认失败并寻求帮助,我需要对正则表达式做什么来排除以__开头的方法?

TIA

1 个答案:

答案 0 :(得分:-1)

你不应该使用正则表达式来解析非常规语言的东西,但无论如何,这都是你正在寻找的......

您的模式不起作用,因为您使用的是(?<!__),这是一个负面的背后隐藏。您需要使用前瞻,因为\s+(?<!__)始终会返回true(\s+不能包含__,因为它{sa} lookbehind当前位置)。 lookahead将向前看(因此名称)。将(?<!__)更改为(?!__)会有效,但我已为您的模式添加了一个不错的\K重置令牌。请参阅代码部分。

代码

See regex in use here

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

说明

我只会解释我改变的内容:

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