使用正则表达式PHP拆分字符串

时间:2017-06-06 03:04:35

标签: php regex split

我的字符串是"30OKOKOKOKOKOKOKOK30OKOKOKOKOKOKOKOKOKOKOKOKOKOK120" 我想把它分成数字和'OK'字符串,我的预期输出是

array(0=>30,1=>OK,2=>OK,......,n=>120)

目前我正在使用此

preg_match_all('!\d+!', $str, $matches);

但它只返回我的数字,即30,30,120 请帮助我达到预期的输出

2 个答案:

答案 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()的速度是原来的两倍。