使用正则表达式 PHP 进行字符串分割

问题描述 投票:0回答:2

我的绳子是

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

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

目前我正在使用这个

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

但它只返回数字,即 30,30,120 请帮助我获得高于预期的输出

php regex split
2个回答
2
投票

你想要的是……

preg_match_all('(\d+|OK)', $string, $matches);
  • \d+
    - 一位或多位数字
  • |
    - 或
  • OK
    - 大写
    O
    后跟大写
    K

0
投票

根据您的输入样本,从效率最低的模式开始到效率最高的模式:

  • /\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()
速度是原来的两倍。

© www.soinside.com 2019 - 2024. All rights reserved.