正则表达式如何使正则表达式以秒/ **为起点

时间:2012-11-17 08:16:52

标签: php regex

这是$ 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 = '')|

然而,我对这个问题的观点是如何让正则表达式以第二个“/ **”为出发点? 对不起,我的英语很差,让你们大家都感到困惑。

2 个答案:

答案 0 :(得分:1)

你可以像这样用正则表达式解析注释(查看Regex look around tutorial):

/\*\*/(?:(?:.(?!\*\*/))*)\*\*/

然后可能出现任意数量的空格:

[\s]*

php中可以使用哪些关键字? staticvirtualfinalpublicprivateprotected 如果我忘记某事,请更正我

(?:(?: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')\ )\ :)

将此附加到您的搜索应该可以解决问题。 (你可能不得不逃避单引号。)