1

这是 $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 行。

出于我的特殊目的,我正在尝试使用正则表达式解析文档块。

这是正则表达式

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

但是,我对这个问题的看法是如何使正则表达式以第二个“/**”为起点?我很抱歉我糟糕的英语让大家感到困惑。

4

2 回答 2

1

您可以像这样通过正则表达式解析注释(查看正则表达式环顾教程):

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

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

[\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 '因此解析值(字符串,字符串,数字,常量):

"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"
\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*'
[\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>)

函数的完整正则表达式如下所示:

function\s+(?P<name>\w\d_+)\s*\(\s*|<argument>((,<argument>)*)\)

我不会为你测试那些正则表达式,这是你的工作,我的目标是向你展示你需要什么,如果你想真正正确地做到这一点(但如果你找到了,请随时编辑我的答案错误)。你也可以使用真正简化的版本(比如一个函数参数的正则表达式吃掉所有东西)。

于 2012-11-17T08:44:50.813 回答
0

如果您想要简单的肮脏技巧,请使用前瞻断言

(?<=if\ (\ !function_exists('wp_set_current_user')\ )\ :)

将此附加到您的搜索中应该可以解决问题。(您可能必须转义单引号。)

于 2012-11-17T08:50:53.497 回答