我在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")
答案 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] 是要走的路。