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()代わりに爆発をお勧めします。

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 に答える