1

次を使用して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

2番目の文字列に期待するもの:

topp - * - a - jdbc_watcher

$ws文字列全体が変数に入れられたのはなぜですか?

4

4 に答える 4

3

%s空白区切り文字の前のできるだけ多くの文字に一致します。代わりにpreg_matchを使用すると、同様のものが得られます。

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

デモ

于 2013-09-17T06:36:05.730 に答える
3

^貪欲になりすぎるのを避けるために使用します。

<?php
$line = 'topp.*.a=jdbs_watcher';
$n = sscanf($line, "%[^.].%[^.].%[^=]=%s", $ws, $layer, $perm, $role);
echo $ws." - ".$layer." - ".$perm." - ".$role."\n";
于 2013-09-17T06:45:08.373 に答える
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";
于 2013-09-17T06:36:47.930 に答える