【问题标题】:Regex match - can't work it out正则表达式匹配 - 无法解决
【发布时间】:2012-09-13 09:56:18
【问题描述】:

我有一个字符串,我需要在 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 拆分字符串的任何好的阅读资源,我也将不胜感激。

谢谢大家!

【问题讨论】:

  • “解析成数组”是什么意思?要将键转换为关联数组的键并将值作为关联值?
  • 对不起 Gianps - 是的,这就是我的意思。所以 (Key: ALL_HTTP)(Value:HTTP_HOST:10.1.1.1 ) 会变成类似 array("ALL_HTTP" => "HTTP_HOST:10.1.1.1")
  • 如果你的输出总是带有分组键和值的括号,你可以完全跳过正则表达式,只删除第一个和最后一个括号,然后在 )( 上拆分并将结果数组成对创建一个新的 key => value 数组(并且您只需修剪 hte 字符串并剥离第一个 'Key:' 或 'Value:'。
  • 感谢@mathematical.coffee 的想法!我试了一下,并用它做了一个 hacky 解决方案:)。

标签: php regex preg-match pcre


【解决方案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:([^)]*)\)/'

【讨论】:

  • @Borodin - 他没有指定输出,我的示例基于他用于正则表达式的内容,他表示在第一场比赛中效果很好。不过,我同意你的看法,这是一种意想不到的匹配方式。
  • 我的意思是它根本不选择Value 字段
  • @Borodin - 啊。我现在明白了。固定的。谢谢。我没有注意到空值,也没有注意到 Value: 之后缺少空格。
【解决方案2】:

正则表达式/\(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) ""
}

【讨论】:

    猜你喜欢
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 2018-01-11
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多