如何用php解析字符串?

时间:2013-09-17 06:18:15

标签: php

我尝试使用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变量?

4 个答案:

答案 0 :(得分:3)

%s将在空格分隔符之前匹配尽可能多的字符。您可以使用preg_match代替类似的工作:

preg_match("/(.*)\.(.*)\.(.*)=(.*)/", $line, $matches);
array_shift($matches);
list($ws, $layer, $perm, $role) = $matches;

Demo

答案 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