从文档字符串行开始修剪星号

时间:2017-01-29 14:53:42

标签: php regex

我想从文档字符串中删除评论:

/**
 * 
 * Another method
 *
 * * This is a bullet point
 *
 * @return [type] [description]
 */

分为:

Another method

* This is a bullet point

@return [type] [description]

到目前为止我所拥有的:

<?php
$string = substr($docstring, 3, -2); // Strips opening/closing tags
$string = preg_replace('/^\s*\*\s*/m', '', $string);

不幸的是,正则表达式并没有很好地运作并且给了我这个:

* Another method
@return [type] [description]

似乎正则表达式匹配多行,然后跳到下一行开头,错过了第一行的实际内容。

以下变化似乎很有希望,但它也不起作用:

/^\s*\*\s*?(?=>\S|$)/m

修改:为了澄清,我想从行首开始修剪一个星号

6 个答案:

答案 0 :(得分:0)

这应该足够了:

$docstring = '/**
 * 
 * Another method
 * @return [type] [description]
*/';

$result = preg_replace('~^[\s*/]+~m', '', $docstring);

答案 1 :(得分:0)

我无法查看代码中的错误并重复您的结果。但是下面的代码似乎有效。

$string = preg_replace('/^[\s\*]+/m', '', $string);

答案 2 :(得分:0)

这应该有效。如果你可以把它留下来,为什么要使用前瞻?

preg_replace('/^\W?\*?+\W?/m', '', $str);

答案 3 :(得分:0)

首先,您需要解析代码段以使用token_get_all()提取多行注释:

function docBlocks($code)
{
    return array_filter(token_get_all($code), function($token) {
            if ($token[0] == T_DOC_COMMENT) {
                if (preg_match('~^\s*/\*\*~', $token[1])) {
                    return true;
                }
            }
        }
    );
}

然后应用替代星号并删除评论分隔符:

var_dump(preg_replace(['~/\*\*~',
    '~\s*\*/~',
    '~^ *\*~m'],
    '',
    array_column(docBlocks($snippet), 1))
);

输出:

array(2) {
  [0]=>
  string(82) "

 Another method

 * This is a bullet point

 @return [type] [description]"
  [1]=>
  string(82) "

 Another method

 * This is a bullet point

 @return [type] [description]"
}

<强> PHP live demo

答案 4 :(得分:0)

我看到这里发生了什么,可以解释你为什么得到你所拥有的东西。

以下是$ string的内容:

 *
 * Another method
 * @return [type] [description]

然后正则表达式&#39; / ^ \ s * \ * \ s * / m&#39;将匹配第二个*之前的所有内容,因为\ s也将匹配换行符。然后前两行将被视为/仅被视为一行而第二行将被删除。

答案 5 :(得分:-1)

在我的问题中,我提到/^\s*\*\s*?(?=>\S|$)/m有保证。

事实证明,pcre不喜欢具有前瞻性的多线模式。因此,为了获得相同的效果,我摆脱了前瞻,并将其作为捕获和替换:

<?php
$string = substr($docstring, 3, -2); // Strips opening/closing tags
$string = preg_replace('/^\s*\*\s*?(\S|$)/m', '\1', $string);