我使用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
)
)
的元素。
我试过
__construct
和(?<!__)
我承认失败并寻求帮助,我需要对正则表达式做什么来排除以__开头的方法?
TIA
答案 0 :(得分:-1)
你不应该使用正则表达式来解析非常规语言的东西,但无论如何,这都是你正在寻找的......
您的模式不起作用,因为您使用的是(?<!__)
,这是一个负面的背后隐藏。您需要使用前瞻,因为\s+(?<!__)
始终会返回true(\s+
不能包含__
,因为它{sa} lookbehind
当前位置)。 lookahead
将向前看(因此名称)。将(?<!__)
更改为(?!__)
会有效,但我已为您的模式添加了一个不错的\K
重置令牌。请参阅代码部分。
^\s*public\s+function\s+(?!__)\K\w+\b
我只会解释我改变的内容:
(?!__)
确保以下内容与字面上的__
不匹配。您也可以将其替换为(?!_{2})
,以获得非常轻微的性能提升。\K
重置报告的匹配的起点。任何以前消费的字符都不再包含在最终匹配中。