次のような文字列があります。
"size:34,35,36,36,37|color:blue,red,white"
preg_match(_all) ですべての色を一致させることは可能ですか? 出力配列に「青」、「赤」、「白」を取得するようにするには?
色はなんでもいいから行かない (青|赤|白)
次のような文字列があります。
"size:34,35,36,36,37|color:blue,red,white"
preg_match(_all) ですべての色を一致させることは可能ですか? 出力配列に「青」、「赤」、「白」を取得するようにするには?
色はなんでもいいから行かない (青|赤|白)
|
:
,
???
他の回答で提案されているような正規表現を使用する私見は、次のような単純なものよりもはるかに「醜い」ソリューションです。
$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
)
)
でラウンドアバウトに達成できますが、preg_match_all()
代わりに爆発をお勧めします。
preg_match_all('/([a-z]+)(?:,|$)/', "size:34,35,36,36,37|color:blue,red,white", $a);
print_r($a[1]);
私はそれが後ろ向きで可能だと思います:
/(?<=(^|\|)color:([^,|],)*)[^,|](?=\||,|$)/g
(のpreg_match_all
)
あなたの爆発的な解決策は明らかにきれいです:-)