这可以用preg_match吗?

时间:2013-02-26 23:30:49

标签: php regex preg-match

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

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

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

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

3 个答案:

答案 0 :(得分:3)

  1. |
  2. 上爆炸
  3. :
  4. 上爆炸
  5. ,
  6. 上爆炸
  7. ???
  8. 利润!
  9. 代码

    使用正常表达式的恕我直言,就像在其他答案中建议的那样,是一个非常“丑陋”的解决方案,而不是像这样简单的事情:

    $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
            )
    
    )
    

答案 1 :(得分:1)

你可以使用preg_match_all()来实现这一目标,但我建议改为爆炸。

preg_match_all('/([a-z]+)(?:,|$)/', "size:34,35,36,36,37|color:blue,red,white", $a);
print_r($a[1]);

答案 2 :(得分:0)

我认为可以使用lookbehind

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

(对于preg_match_all

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