【问题标题】:Regex: Split string on number/string?正则表达式:在数字/字符串上拆分字符串?
【发布时间】:2012-12-13 15:38:05
【问题描述】:

考虑以下几点:

700italic
regular
300bold
300bold900

所有这些都是不同的示例,每次只会执行其中一行。

预期结果:

// 700italic
array(
    0 => 700
    1 => itailc
)

// regular
array(
    0 => regular
)

// 300bold
array(
    0 => 300
    1 => bold
)

// 300bold900
array(
    0 => 300
    1 => bold
    2 => 900
)

我做了以下:

(\d*)(\w*)

但这还不够。当我只有两个“部分”(数字|字符串或字符串|数字)时,它有点工作,但如果我添加第三个“段”,我将无法工作。

有什么建议吗?

【问题讨论】:

标签: php regex string split numbers


【解决方案1】:

您可以改用preg_split。然后你可以使用lookarounds来匹配单词和字母之间的位置:

$result = preg_split('/(?<=\d)(?=[a-z])|(?<=[a-z])(?=\d)/i', $input);

请注意,\w 除了匹配字母外,还匹配数字(和下划线)。

另一种选择(使用匹配函数)是使用preg_match_all,并且每次匹配只匹配数字字母:

preg_match_all('/\d+|[a-z]+/i', $input, $result);

您现在将获得一个匹配结果数组中每个所需元素的单一匹配项,而不是捕获。但是你只想要最后的数组,所以你并不关心它们来自哪里。

【讨论】:

    【解决方案2】:

    可以使用PREG_SPLIT_DELIM_CAPTURE 标志。

    例子:

    <?php
    
    $key= "group123425";
    $pattern = "/(\d+)/";
    
    $array = preg_split($pattern, $key, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
    print_r($array);
    
    ?>
    

    同时查看this 的帖子。

    【讨论】:

      【解决方案3】:

      你正在寻找preg_split:

      preg_split(
          '((\d+|\D+))', $subject, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY
      )
      

      Demo

      preg_match_all:

      preg_match_all('(\d+|\D+)', $test, $matches) && $matches = $matches[0];
      

      Demo

      【讨论】:

        【解决方案4】:

        你应该匹配它而不是拆分它..

        你仍然可以使用分割它

        (?<=\d)(?=[a-zA-Z])|(?<=[a-zA-Z])(?=\d)
        

        【讨论】:

        • +1 用于在几乎完全相同的时间编写完全相同的解决方案;)
        【解决方案5】:

        你可以使用这样的模式:

        (\d*)([a-zA-Z]*)(\d*)
        

        或者您可以将preg_match_all 与这样的模式一起使用:

        '/(?:[a-zA-Z]+|\d+)/'
        

        然后您可以匹配任意数量的段,每个段仅由字母或数字组成。

        【讨论】:

          【解决方案6】:

          可能是这样的:

          (\d*)(bold|italic|regular)(\d*)
          

          (\d*)([a-zA-Z]*)(\d*)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-05
            • 1970-01-01
            相关资源
            最近更新 更多