我的绳子是
"30OKOKOKOKOKOKOKOK30OKOKOKOKOKOKOKOKOKOKOKOKOKOK120"
我想将它分成数字和“OK”字符串,我的预期输出是
array(0=>30,1=>OK,2=>OK,......,n=>120)
目前我正在使用这个
preg_match_all('!\d+!', $str, $matches);
但它只返回数字,即 30,30,120 请帮助我获得高于预期的输出
你想要的是……
preg_match_all('(\d+|OK)', $string, $matches);
\d+
- 一位或多位数字|
- 或OK
- 大写 O
后跟大写 K
根据您的输入样本,从效率最低的模式开始到效率最高的模式:
/\d+|OK/
(96 个步骤)<-- Shammel's pattern/OK|\d+/
(77步)#更快的替代方案优先/\d+|\D{2}
(74 个步骤)#make OK 分隔符非文字/\D{2}|\d+/
(55步)#首先是更快的替代方案我建议使用 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, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE));
// or /(\D{2})/
此方法返回一个 1 维数组(不是带有要引用的变量的 true/false),具有 110 个步骤(或 104 个非文字 OK 分隔)的四字符模式。 因此,对于这种情况,
preg_match_all()
速度是原来的两倍。