我的字符串是"30OKOKOKOKOKOKOKOK30OKOKOKOKOKOKOKOKOKOKOKOKOKOK120"
我想把它分成数字和'OK'字符串,我的预期输出是
array(0=>30,1=>OK,2=>OK,......,n=>120)
目前我正在使用此
preg_match_all('!\d+!', $str, $matches);
但它只返回我的数字,即30,30,120 请帮助我达到预期的输出
答案 0 :(得分:2)
你想要的是......
preg_match_all('(\d+|OK)', $string, $matches);
\d+
- 一个或多个数字|
- 或OK
- 资本O
后跟资本K
答案 1 :(得分:0)
从最低效率到最有效的模式开始,给出输入样本:
/\d+|OK/
(96步)< - Shammel的模式/OK|\d+/
(77步)#faster alternative first /\d+|[^\d]{2}
(74步)#make OK分隔符非文字/[^\d]{2}|\d+/
(55步)#faster alternative first 我会说使用55步骤。
$in='30OKOKOKOKOKOKOKOK30OKOKOKOKOKOKOKOKOKOKOKOKOKOK120';
var_export(preg_match_all('/[^\d]{2}|\d+/',$in,$out)?$out[0]:[]);
注意,preg_match_all()
会创建一个多维数组。
另一种选择是使用preg_split()
。通过在其第四个参数中使用几个标志,与我上面的最佳模式相比,可以使用惊人的简短模式实现相同的结果,效率损失最小。
var_export(preg_split('/(OK)/',$in,null,PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE));
// or /([^\d]{2})/
此方法返回一个1-dim数组(不是带有要引用的变量的true / false),其中包含110个步骤中的四个字符模式(或104个非文字OK分隔符)。因此,对于这种情况,preg_match_all()
的速度是原来的两倍。