我的字符串看起来像这样:
"size:34,35,36,36,37|color:blue,red,white"
是否可以匹配preg_match(_all)中的所有颜色? 这样我在输出数组中会得到“蓝色”,“红色”和“白色”吗?
颜色可以是任何颜色,所以我不能去(蓝|红|白)
答案 0 :(得分:3)
|
:
,
???
使用正常表达式的恕我直言,就像在其他答案中建议的那样,是一个非常“丑陋”的解决方案,而不是像这样简单的事情:
$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
)
你的爆炸解决方案显然更清洁: - )