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
的元素
我试过了
- 将开头的 \w 更改为 \b,这是一场灾难,找不到方法名称
- 将 \w 的位置更改为 (.*) 之外,效果不佳
(?<!__)
和 (?<!_)
的组合
我认输求助,我需要对正则表达式做些什么来排除以__开头的方法?
TIA
简介
您不应该使用正则表达式来解析不是常规语言的东西,但是无论如何,这就是您要找的...
您的模式无效,因为您使用了 (?<!__)
,这是一种消极的回顾。您需要使用前瞻,因为 \s+(?<!__)
将始终 return 为真(\s+
不能包含 __
并且因为它是 lookbehind
它在当前位置后面查找) . lookahead
将向前看(因此得名)。将 (?<!__)
更改为 (?!__)
会起作用,但我已经为您的模式添加了一个很好的 \K
重置标记。请参阅 代码 部分。
代码
^\s*public\s+function\s+(?!__)\K\w+\b
说明
我只会解释我改变了什么:
(?!__)
确保后面的内容与 __
字面意思不符。您也可以将其替换为 (?!_{2})
,以获得 非常轻微的 性能提升。
\K
重置报告匹配的起点。任何先前消耗的字符不再包含在最终匹配中。
我正在使用 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
的元素
我试过了
- 将开头的 \w 更改为 \b,这是一场灾难,找不到方法名称
- 将 \w 的位置更改为 (.*) 之外,效果不佳
(?<!__)
和(?<!_)
的组合
我认输求助,我需要对正则表达式做些什么来排除以__开头的方法?
TIA
简介
您不应该使用正则表达式来解析不是常规语言的东西,但是无论如何,这就是您要找的...
您的模式无效,因为您使用了 (?<!__)
,这是一种消极的回顾。您需要使用前瞻,因为 \s+(?<!__)
将始终 return 为真(\s+
不能包含 __
并且因为它是 lookbehind
它在当前位置后面查找) . lookahead
将向前看(因此得名)。将 (?<!__)
更改为 (?!__)
会起作用,但我已经为您的模式添加了一个很好的 \K
重置标记。请参阅 代码 部分。
代码
^\s*public\s+function\s+(?!__)\K\w+\b
说明
我只会解释我改变了什么:
(?!__)
确保后面的内容与__
字面意思不符。您也可以将其替换为(?!_{2})
,以获得 非常轻微的 性能提升。\K
重置报告匹配的起点。任何先前消耗的字符不再包含在最终匹配中。