【问题标题】:Split string into associative array (while maintaining characters)将字符串拆分为关联数组(同时保留字符)
【发布时间】:2014-07-29 09:51:18
【问题描述】:

我正在尝试弄清楚如何拆分如下所示的字符串:

a20r51fx500fy3000

进入一个如下所示的关联数组:

array(
    'a' => 20,
    'r' => 51,
    'fx' => 500,
    'fy' => 3000,
);

我认为我不能使用 preg_split,因为这会丢弃我要拆分的角色(我尝试过 /[a-zA-Z]/,但显然这并没有达到我想要的效果)。如果我可以使用某种内置函数来做到这一点,我会更喜欢,但如果需要的话,我并不介意循环。

任何帮助将不胜感激!

【问题讨论】:

  • preg_match_all('/([a-z]+)(\d+)/', ... 应该可以帮助您完成大部分工作。然后做一个小循环来按照你想要的方式格式化数组。

标签: php arrays regex


【解决方案1】:

多重匹配和 PREG_SET_ORDER

这样做:

$yourstring = "a20r51fx500fy3000";
$regex = '~([a-z]+)(\d+)~';
preg_match_all($regex,$yourstring,$matches,PREG_SET_ORDER);
$yourarray=array();
foreach($matches as $m) {
    $yourarray[$m[1]] = $m[2];
}
print_r($yourarray);

输出:

Array ( [a] => 20 [r] => 51 [fx] => 500 [fy] => 3000 ) 

如果您的字符串可以包含大写字母,请通过在结束分隔符后添加 i 标志使正则表达式不区分大小写:$regex = '~([a-z]+)(\d+)~i';

说明

  • ([a-z]+) 捕获到第 1 组的信件
  • (\d+) 将数字捕获到第 1 组
  • $yourarray[$m[1]] = $m[2]; 为字母创建索引,并分配数字

【讨论】:

  • 另请注意,如果您的字符串可以包含大写字母,只需使用i 标志使正则表达式不区分大小写:$regex = '~([a-z]+)(\d+)~i';
  • 你为什么使用PREG_SET_ORDER
  • 您可以在 php.net 上阅读 PREG_SET_ORDER 订单结果,因此 $matches[0] 是完整模式匹配的数组,$matches[1] 是由第一个带括号的子模式匹配的字符串数组,等等。
猜你喜欢
  • 1970-01-01
  • 2019-05-26
  • 1970-01-01
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
相关资源
最近更新 更多