Php 正则表达式匹配-can';我没办法

Php 正则表达式匹配-can';我没办法,php,regex,preg-match,pcre,Php,Regex,Preg Match,Pcre,我有一个字符串需要在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

我有一个字符串需要在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:)
preg_match('/(\S+): (\S+)/', $string, $result);
“键/值”对的数量可以是无限的,但通常是每个字符串30-40对

我一直在玩preg_match和PHP.net中一个示例的变体-类似于以下内容:

(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:)
preg_match('/(\S+): (\S+)/', $string, $result);
这会将第一个键作为$result[0]返回,但对其他键没有帮助

如果有人能给我一个恰当的表达,那就太好了。我也很感激任何关于用PCRE拆分字符串的好的阅读资源


谢谢大家

尝试一些类似于

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:([^)]*)\)/'

正则表达式
/\(键:\s*(.*)\)\(值:\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) ""
}

“解析为数组”是什么意思?您想将键转换为关联数组的键,并将值作为关联值?对不起,Gianps-是的,这就是我的意思。因此,(Key:ALL_-HTTP)(Value:HTTP_-HOST:10.1.1.1)将变成类似于array(“ALL_-HTTP”=>“HTTP_-HOST:10.1.1.1”)的东西。如果您的输出总是带有对键和值进行分组的括号,那么您可以完全跳过regex,只需删除第一个和最后一个括号,然后在
上拆分(
并将生成的数组成对创建一个新的
key=>value
数组(您只需修剪字符串并去掉第一个“key:”或“value:”。感谢您的想法@mathematic.coffee!我尝试了一下,并用它制作了一个hacky解决方案:).@Borodin-他没有指定输出,我的示例基于他在正则表达式中使用的内容,他表示正则表达式在第一次匹配中运行良好。不过,我同意你的说法,这是一种意外的匹配方式。我的意思是,它不会同时拾取
字段all@Borodin-啊。我明白了。修好了。谢谢。我没注意到已删除空值,也没有在值后缺少空格:。