0

PHPで配列に解析する必要のある文字列があります。文字列は次のようになります。

(Key: ALL_HTTP)(Value:HTTP_HOST:10.1.1.1 )(Key: ALL_RAW)(Value:Host: 10.1.1.1:80 )(Key: APPL_MD_PATH)(Value:/ROOT)(Key: AUTH_TYPE)(Value:)(Key: AUTH_USER)(Value:)(Key: AUTH_PASSWORD)(Value:)(Key: LOGON_USER)(Value:)(Key: REMOTE_USER)(Value:)

「キー/値」のペアの数は無制限にすることができますが、通常は文字列ごとに約30〜40です。

私はpreg_matchとPHP.netの例のバリエーションで遊んでいます-次のようなものです:

preg_match('/(\S+): (\S+)/', $string, $result);

これにより、最初のキーが$ result [0]として返されますが、残りのキーは役に立ちません。

誰かが私に適切な表現を手伝ってくれるなら、それは素晴らしいことです。また、PCREで文字列を分割するための優れた資料をいただければ幸いです。

皆さんありがとう!

4

2 に答える 2

1

正規表現/\(Key:\s*(.*?)\)\(Value:\s*(.*?)\)/は、文字列内のすべてのキーと値のペアに一致します

このプログラムは$data、要素に関連付けられた各キーと値のペアを使用して配列を作成します

$str = '(Key: ALL_HTTP)(Value:HTTP_HOST:10.1.1.1 )(Key: ALL_RAW)(Value:Host: 10.1.1.1:80 )(Key: APPL_MD_PATH)(Value:/ROOT)(Key: AUTH_TYPE)(Value:)(Key: AUTH_USER)(Value:)(Key: AUTH_PASSWORD)(Value:)(Key: LOGON_USER)(Value:)(Key: REMOTE_USER)(Value:)';

$list = preg_match_all('/\(Key:\s*(.*?)\)\(Value:\s*(.*?)\)/', $str, $data);
$data = array_combine($data[1], $data[2]);

var_dump($data);

出力

array(8) {
  ["ALL_HTTP"]=>
  string(19) "HTTP_HOST:10.1.1.1 "
  ["ALL_RAW"]=>
  string(18) "Host: 10.1.1.1:80 "
  ["APPL_MD_PATH"]=>
  string(5) "/ROOT"
  ["AUTH_TYPE"]=>
  string(0) ""
  ["AUTH_USER"]=>
  string(0) ""
  ["AUTH_PASSWORD"]=>
  string(0) ""
  ["LOGON_USER"]=>
  string(0) ""
  ["REMOTE_USER"]=>
  string(0) ""
}
于 2012-09-21T01:29:01.763 に答える
1

の線に沿って何かを試してみてください

preg_match_all('/\(([^:)]+):\s*([^)]*)\)/',
        "(Key: ALL_HTTP)(Value:HTTP_HOST:10.1.1.1 )(Key: ALL_RAW)(Value:Host: 10.1.1.1:80 )(Key: APPL_MD_PATH)(Value:/ROOT)(Key: AUTH_TYPE)(Value:)(Key: AUTH_USER)(Value:)(Key: AUTH_PASSWORD)(Value:)(Key: LOGON_USER)(Value:)(Key: REMOTE_USER)(Value:)",
        $out, PREG_SET_ORDER);

foreach ($out as $pair) {
    echo "ALL: ".$pair[0]."\n";
    echo "KEY: ".$pair[1]."\n";
    echo "VAL: ".$pair[2]."\n";
}

おそらくALL行は必要ありません。

サンプル文字列に基づいて、この正規表現の方が好きかもしれません。

'/\(Key: ([^)]+)\)\(Value:([^)]*)\)/'
于 2012-09-21T01:07:12.387 に答える