オペレーティングシステムインスタンスのリストを一意の識別子で解析しようとしています。テキスト文字列を解析し、値を2つの変数に渡すソリューションを探しています。解析される文字列は次のとおりです。
"Ubuntu 9.10" {40f2324d-a6b2-44e4-90c3-0c5fa82c987d}
オペレーティングシステムインスタンスのリストを一意の識別子で解析しようとしています。テキスト文字列を解析し、値を2つの変数に渡すソリューションを探しています。解析される文字列は次のとおりです。
"Ubuntu 9.10" {40f2324d-a6b2-44e4-90c3-0c5fa82c987d}
私はsscanf()のドキュメントを読むための言い訳を探していました:
sscanf($s, '"%[^"]" {%[^}]}', $os, $ident);
echo $os, "<br>", $ident;
フォローアップ:興味のために、現在この質問にある3つの回答のうち:
sscanf: 0.92999792098999 seconds
preg_match: 4.73761510849 seconds
str_replace x2 + preg_split: 3.7644839286804 seconds
ここでベンチマーク。str_replace()
2つとapreg_split()
がよりも速いのはおかしいですpreg_match()
。
正規表現を使用して、必要なグループに一致させることができます。
$str = '"Ubuntu 9.10" {40f2324d-a6b2-44e4-90c3-0c5fa82c987d}';
preg_match('/^"(.*)" {(.*)}$/', $str, $matches);
値に基づいて正規表現を狭くすることができますが(たとえば、2番目の式.*
は[0-9a-f-]+
)、それで十分です。$matches[1]
「Ubuntu9.10」、$matches[2]
「40f2324d-a6b2-44e4-90c3-0c5fa82c987d」になります
これにより、 str_replaceとpreg_splitを使用して、2つの文字列が文字列配列の1番目と2番目の要素として取得されます。
$s = "\"Ubuntu 9.10\" {40f2324d-a6b2-44e4-90c3-0c5fa82c987d}";
$s = str_replace("\" ", "|", $s); // substitute middle quotation mark and space for a delimiter
$s = str_replace("\"", "", $s); // remove quotation marks
$vars = preg_split('/\|/', $s); // split by delimiter
print_r($vars);