我尝试使用sscanf()
解析字符串:
$n = sscanf($line, "%s.%s.%s=%s", $ws, $layer, $perm, $role);
echo $ws." - ".$layer." - ".$perm." - ".$role."\n";
获得输出:
*.*.r=* - - -
topp.*.a=jdbs_watcher - - -
输入示例:
*.*.r=*
topp.*.a=jdbs_watcher
我希望看到第二个字符串:
topp - * - a - jdbc_watcher
为什么整个字符串已被放入$ws
变量?
答案 0 :(得分:3)
%s
将在空格分隔符之前匹配尽可能多的字符。您可以使用preg_match代替类似的工作:
preg_match("/(.*)\.(.*)\.(.*)=(.*)/", $line, $matches);
array_shift($matches);
list($ws, $layer, $perm, $role) = $matches;
答案 1 :(得分:3)
使用^
来避免过于贪婪:
<?php
$line = 'topp.*.a=jdbs_watcher';
$n = sscanf($line, "%[^.].%[^.].%[^=]=%s", $ws, $layer, $perm, $role);
echo $ws." - ".$layer." - ".$perm." - ".$role."\n";
答案 2 :(得分:2)
sscanf()
不是字符串解析器。它是一个格式化的输入扫描器,用于使用C风格的语法将格式化的输入分配给变量。您想要完成的任务可以使用explode()
完成。
//Scan input
$n = sscanf($line, "%s", $input);
//Parse by .
$parsed = explode(".", $input);
//Parse by =
$parsed[2] = explode("=", $parsed[2]);
//Create bindings
$ws = $parsed[0];
$layer = $parsed[1];
$perm = $parsed[2][0];
$role = $parsed[2][1];
//Echo
echo $ws." - ".$layer." - ".$perm." - ".$role."\n";
答案 3 :(得分:2)
嗯,在php.net之前发现了这种行为。
作为解决方法,您可以使用:
<?php
header('Content-Type: text/plain; charset=utf-8');
$line = 'topp.*.a=jdbs_watcher';
list($ws, $layer, $perm) = explode('.', $line);
list($perm, $role) = explode('=', $perm);
echo $ws." - ".$layer." - ".$perm." - ".$role."\n";
?>
结果:
topp - * - a - jdbs_watcher