我想从文档字符串中删除评论:
/**
*
* 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
修改:为了澄清,我想从行首开始修剪一个星号
答案 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);