Php 如何从以“,”分隔的字符串中形成两个数组&引用;然后是-?
我试图从Php 如何从以“,”分隔的字符串中形成两个数组&引用;然后是-?,php,arrays,regex,string,Php,Arrays,Regex,String,我试图从$str中提取字符串,这些字符串在一个数组中以“,”分隔,在“-”之前,在第二个数组中以“,”分隔,在“-”之后。因此,$arr1=数组(a,b,c,d)和$arr2=数组(e、f、g、h)。我只是以$str为例,通常我希望它适用于任何形式相同的字符串,即$str=s1、s2、s3、s4、s5、.-r1、r2、t3…… 注意:若$str中并没有“-”,那个么$arr2将消失,并且$arr1包含一个由“,”分隔的元素数组 这就是我试过的 $str="a,b,c,d-e,f,g,h" 但是
$str
中提取字符串,这些字符串在一个数组中以“,”分隔,在“-”之前,在第二个数组中以“,”分隔,在“-”之后。因此,$arr1=数组(a,b,c,d)
和$arr2=数组(e、f、g、h)代码>。我只是以$str
为例,通常我希望它适用于任何形式相同的字符串,即$str=s1、s2、s3、s4、s5、.-r1、r2、t3……
注意:若$str
中并没有“-”,那个么$arr2
将消失,并且$arr1
包含一个由“,”分隔的元素数组
这就是我试过的
$str="a,b,c,d-e,f,g,h"
但是,每个数组都有一个包含字符串str
的元素。
有人知道为什么这不起作用吗
preg_match_all('~(^|.*,)(.*)(,.*|\-|$)~', $str, $arr1);
preg_match_all('~(-|.*,)(.*)(,.*|$)~', $str, $arr2);
您可以简单地使用preg\u match
检查您的字符串是否包含-
如果是,则可以简单地使用array\u walk
如下
^(.*?(?=-|$))(?:-(.*$))?
您的所有正则表达式模式都不是最优的,而且似乎使用和更容易解决此任务:
array\u map()
对每个元素应用回调函数后,返回包含array1
的所有元素的数组。回调函数接受的参数数量应与传递给array\u map()
看
结果:
$str="a,b,c,d-e,f,g,h";
$ex = array_map(function ($s) {
return explode(",", $s);
}, explode("-", $str));
print_r($ex);
没有正则表达式(最合理的方法):
使用正则表达式(用于挑战):
这不适用于格式为'-a、b、c、d'
的字符串。元素a
、b
、c
、d
提取在$arr1
中,而不是$arr2
中查看-这是您需要的吗?如果您有任何疑问,请随时发表评论。向下投票人至少张贴向下投票的原因。所以我可以改进我的答案
$str = 'a,b,c,d-e,f,g,h';
$result = [];
if(preg_match('/[-]/', $str)){
array_walk(explode('-',$str),function($v,$k)use(&$result){
$result[] = explode(',',$v);
});
}else{
array_walk(explode(',',$str),function($v,$k)use(&$result){
$result[] = $v;
});
}
print_r($result);
$str="a,b,c,d-e,f,g,h";
$ex = array_map(function ($s) {
return explode(",", $s);
}, explode("-", $str));
print_r($ex);
Array
(
[0] => Array
(
[0] => a
[1] => b
[2] => c
[3] => d
)
[1] => Array
(
[0] => e
[1] => f
[2] => g
[3] => h
)
)
$str="a,b,c,d-e,f,g,h";
list($arr1, $arr2) = explode('-', $str);
$arr1 = explode(',', $arr1);
if ($arr2)
$arr2 = explode(',', $arr2);
else
unset($arr2);
if (preg_match_all('~(?:(?!\G)|\A)([^-,]+)|-?([^,]+),?~', $str, $m)) {
$arr1 = array_filter($m[1]);
if (!$arr2 = array_filter($m[2]))
unset($arr2);
}