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

尝试一些类似的东西

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";
}

您可能不需要所有行。

根据您的示例字符串,您可能更喜欢这个正则表达式:

'/\(Key: ([^)]+)\)\(Value:([^)]*)\)/'
于 2012-09-21T01:07:12.387 回答
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 回答