通过应用一些规则将字符串拆分成块

Splitting string into chunks by applying some rules

我想将 abc49.99ab55.5def89de7 分成块以获得下面的结果(或类似结果)。 注意:仅允许 abcabdefde。数字可以是浮点数。

理想情况下:

Array
(
    [abc] => 49.99
    [ab] => 55.5
    [def] => 89
    [de] => 7
)

这个也可以:

Array
(
    [0] => abc49.99
    [1] => ab55.5
    [2] => def89
    [3] => de7
)

在看到一些例子后,我想出了下面的例子,但遗憾的是无法增强它们以满足上面定义的需求。你能帮忙解决这件事吗?

1

preg_match('/(?<fo>abc|ab)?(?<fn>\d*\.?\d*)(?<so>def|de)?(?<sn>\d*\.?\d*)?/', 'abc49.99ab55.5def89de7', $matches);

Array
(
    [0] => abc49.99
    [fo] => abc
    [1] => abc
    [fn] => 49.99
    [2] => 49.99
    [so] => 
    [3] => 
    [sn] => 
    [4] => 
)

2

preg_match_all('~^(.*?)(\d+)~m', 'abc49.99ab55.5def89de7', $matches);

Array
(
    [0] => Array
        (
            [0] => abc49
        )

    [1] => Array
        (
            [0] => abc
        )

    [2] => Array
        (
            [0] => 49
        )

)

来自 OP 的 。这应该适合你:

<?php

    $str = "abc49.99ab55.5def89de7";
    $arr = preg_split("/(?<=[0-9])(?=[a-z])/i", $str);
    print_r($arr);

?>

正则表达式解释:

/(?<=[0-9])(?=[a-z])/i
  • (?<=[0-9]) Positive Lookbehind - 断言下面的正则表达式可以匹配
    • [0-9] 匹配下面列表中的单个字符
      • 0-9 0到9之间的单个字符
  • (?=[a-z]) Positive Lookahead - 断言下面的正则表达式可以匹配
    • [a-z] 匹配下面列表中的单个字符
      • a-z 介于 a 和 z 之间的单个字符(不区分大小写)

flags:

  • i修饰符:不敏感。不区分大小写的匹配(忽略 [a-zA-Z] 的大小写)