带有冲突分隔符的格式化字符串解析

时间:2014-04-16 17:54:03

标签: php string parsing split

解析由\和已知关键字分隔的字符串的最快/最简单方法是什么?

$str = 'key1\0815\key2\some string here\key3\string with \ in between\key4\0

我需要将它们放在一个数组(key => value)供以后使用,但是如果某些值可能包含\,我该如何设置拆分字符串? 关键字是已知的,但它们都是唯一的。

explode()会失败并且sscanf()将是一个大量的手动编辑

2 个答案:

答案 0 :(得分:2)

使用preg_split()来实现这一目标:

$arr = preg_split('/\\\\(?!\s)/', $str);

$result = array();

foreach (array_chunk($arr, 2) as $sub) {
    list($key, $value) = $sub;
    $result[$key] = $value;
}

输出:

Array
(
    [keyword1] => 0815
    [keyword2] => some string here
    [keyword3] => string with \ in between
    [keyword4] => 0
)

Demo

答案 1 :(得分:0)

这应该这样做:

$result = array_combine(
    $keys = preg_grep('/key[\d]+/',
        $parts = preg_split('/(?:\\\\)?(key[\d]+)\\\\/', $str, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE)),
    $vals = array_diff($parts, $keys));