0

我有看起来像这样的字符串:

"size:34,35,36,36,37|color:blue,red,white"

是否可以匹配 preg_match(_all) 中的所有颜色?这样我会在输出数组中得到“蓝色”、“红色”和“白色”?

颜色可以是任何颜色,所以我不能去(蓝色|红色|白色)

4

3 回答 3

3
  1. 爆发|
  2. 爆发:
  3. 爆发,
  4. ???
  5. 利润!

代码

恕我直言,使用其他答案中建议的正则表达式是一个比这样简单的解决方案更“丑陋”的解决方案:

$input = 'size:34,35,36,36,37|color:blue,red,white|undercoating:yes,no,maybe,42';

function get_option($name, $string) {
    $raw_opts = explode('|', $string);
    $pattern = sprintf('/^%s:/', $name);
    foreach( $raw_opts as $opt_str ) {
        if( preg_match($pattern, $opt_str) ) {
            $temp = explode(':', $opt_str);
            return $opts = explode(',', $temp[1]);
        }
    }
    return false; //no match
}

function get_all_options($string) {
    $options = array();
    $raw_opts = explode('|', $string);
    foreach( $raw_opts as $opt_str ) {
        $temp = explode(':', $opt_str);
        $options[$temp[0]] = explode(',', $temp[1]);
    }
    return $options;
}

print_r(get_option('undercoating', $input));
print_r(get_all_options($input));

输出:

Array
(
    [0] => yes
    [1] => no
    [2] => maybe
    [3] => 42
)
Array
(
    [size] => Array
        (
            [0] => 34
            [1] => 35
            [2] => 36
            [3] => 36
            [4] => 37
        )

    [color] => Array
        (
            [0] => blue
            [1] => red
            [2] => white
        )

    [undercoating] => Array
        (
            [0] => yes
            [1] => no
            [2] => maybe
            [3] => 42
        )

)
于 2013-02-26T23:37:02.360 回答
1

你可以用一种方式来实现它,preg_match_all()但我建议你用explode代替。

preg_match_all('/([a-z]+)(?:,|$)/', "size:34,35,36,36,37|color:blue,red,white", $a);
print_r($a[1]);
于 2013-02-26T23:38:25.387 回答
0

我认为向后看是可能的:

 /(?<=(^|\|)color:([^,|],)*)[^,|](?=\||,|$)/g

(对于preg_match_all

您的爆炸解决方案显然更清洁:-)

于 2013-02-26T23:45:03.070 回答