如何使用正则表达式使用PHP解析此注释块?

时间:2010-11-27 10:56:35

标签: php regex

我在preg_match_all()函数中遇到问题。这种类型的字符串的正则表达式模式是什么?

考虑以下代码:

$str="* Function do Something * @param String $variable1 * @param String $variable2 * @return String";

我希望preg_match的模式将此字符串解析为此数组形式...它将@param@return@author等分开。

它应该像这样打印数组:

array("param"=>[0]=>"String $variable1",[1]=>"String $variable2",
    "return"=>"String")

3 个答案:

答案 0 :(得分:3)

试试这个:

$str='* Function do Something * @param String $variable1 * @param String $variable2 * @return String';
$l = explode('*', $str);
$res = array();
foreach($l as $el) {
    if (preg_match("/@(\w+) (.*)$/", $el, $m)) {
        $res[$m[1]][] = $m[2];
    }
}
print_r($res);

输出:

Array
(
    [param] => Array
        (
            [0] => String $variable1
            [1] => String $variable2
        )

    [return] => Array
        (
            [0] => String
        )

)

答案 1 :(得分:1)

试试这个:

preg_match_all('/(?<=[\s])[$@\w\s]*(?=[\s"])/i', $subject, $result, PREG_PATTERN_ORDER);
$result = $result[0];
// $result will be array of matches

这将匹配那些*组之间的所有内容,因此如果您不需要功能部分,请从数组第一次匹配中踢出,并将其余部分用于参数。

GL

答案 2 :(得分:-1)

嗯,首先,常见的分割标识符是*,所以首先我会被它们爆炸:

$segments = explode('*', $text);

然后我看到会有空格,因为在*的两侧我们有空格,所以需要将它们修剪掉,但首先我们需要设置一个空白数组来存储新的清理数据英寸

$results = array();

然后遍历每个段,修剪并检查@符号:

$first = true;
foreach($segments as $segment) {
    // Strip trailing/leading whitespace and line breaks
    $segment = trim(segment);

    if ($first === true) {
        // Name: The very first line would be the name.
        $results['name'] = $segment;
        $first = false;
    } else {
        // Params and return
        if ($segment[0] === "@") {
            // Find the first space, usually after @xxxx text
            $pos = strpos(' ', $segment);

            // Get the name of the var so param for @param
            $index = substr($segment, 1, $pos);
            // rest of the string
            $value = substr($segment, $pos+1);
            switch($index) {
                case 'param':
                case 'params':
                    $results['params'][] = $value;
                    break;
                case 'return':
                case 'returns':
                    $params['return'] = $value;
                    break;
                default:
                    $params[$index] = $value;
                    break;
            }
        }
    }
}

希望你能看到这个代码博克正在做什么,但如果不是下面的一点解释。

在将字符串爆炸成段之后,我们开始循环遍历它们。有一个小的$first变量默认设置为true,所以我们知道它是否是数组的第一次迭代,原因是第一行是函数名称而没有@用来表示命名行的符号。

之后,我们检查索引0处的字符是否等于@。如果是这样,那么我们剪切字符串,以便:

@param fun ...
0123456789 ...
^     ^

因此,如果空格(6)我们将从1切换到索引,这会给'参数'。

创建switch语句后,我们只使用substr()来切断param前缀后的字符串部分(在这种情况下为偏移量6)。

这段代码很可能无法正常运行,但它的编写方式是为了向您展示如何进行此操作。我希望它能帮助你。

其他一些资源:

  • [PHP中是否有一个好的(独立的)PHPDoc解析器类或函数?] [2]

  • [如何使用PHP解析phpDoc样式注释块?] [3]

我真的不认为正则表达式是要走的路,但是如果这真的是你想做的那么 [如何用PHP解析phpDoc样式的注释块?] [6] 是要走的路。