这是$ source示例
/**
* These functions can be replaced via plugins. If plugins do not redefine these
* functions, then these will be used instead.
*/
if ( !function_exists('wp_set_current_user') ) :
/**
* Changes the current user by ID or name.
*
*/
function wp_set_current_user($id, $name = '') {
注意:有些人没有function_exists行。
出于我的特殊目的,我正在尝试用正则表达式解析docblock。
这是正则表达式
$t = preg_match_all("@(/\*\*.*?\*/\nfunction\s.*?\(.*?\))\s{@mis",$source,$m);
我希望得到:
/**
* Changes the current user by ID or name.
*
*/
function wp_set_current_user($id, $name = '') {
但相反,它会返回整个代码示例。
任何帮助都将不胜感激。
我发现有些人问我的目的,但我认为这不重要。
我正在使用geany,我发现现有的wordpress代码提示不完整。
我发现的docblock解析器不解析函数名和函数参数。
所以我试着自己解析它们。
geany的代码提示格式为
wp_set_current_user|Changes the current user by ID or name.|($id, $name = '')|
然而,我对这个问题的观点是如何让正则表达式以第二个“/ **”为出发点? 对不起,我的英语很差,让你们大家都感到困惑。
答案 0 :(得分:1)
你可以像这样用正则表达式解析注释(查看Regex look around tutorial):
/\*\*/(?:(?:.(?!\*\*/))*)\*\*/
然后可能出现任意数量的空格:
[\s]*
php中可以使用哪些关键字? static
,virtual
,final
,public
,private
,protected
如果我忘记某事,请更正我
(?:(?:static|virtual|final|public|private|protected)\s+)*
好的,现在函数标题和大括号:
function\s+(?P<name>\w\d_+)\s*\(...\)
...
部分变得复杂,因为它可以包含默认值,可以是复杂的php字符串($remove_characters = '\'"\n\r '
),所以parsing value(字符串,字符串,数字,常量):
"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"
\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*'
[\d.]+
\w+
导致一个大的value
正则表达式:
("[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*'|[\d.]+|\w+)
每个函数参数都有格式$var
或$var = data
(当然任意数量的空格+我省略array $input = array()
)所以这是简化的var名称匹配:
\\$[\w_][\w\d_]*
类型匹配:
([\w_]+\s+)?
所以函数参数可以是:
\s*([\w_]+\s+)?(\\$[\w_][\w\d_]*|\\$[\w_][\w\d_]*\s*=\s*<value>)
完整的函数regexp看起来像:
function\s+(?P<name>\w\d_+)\s*\(\s*|<argument>((,<argument>)*)\)
我不会为你测试那些正则表达式,这是你的工作,我的目标是向你展示你需要的东西,如果你想真正做到这一点(但随时编辑如果你发现错误,我的回答是。)你也可以使用非常简化的版本(比如只有一个正则表达式用于函数参数吃掉所有东西)。
答案 1 :(得分:0)
如果你想要简单的脏技巧,请使用先行断言
(?<=if\ (\ !function_exists('wp_set_current_user')\ )\ :)
将此附加到您的搜索应该可以解决问题。 (你可能不得不逃避单引号。)