正则表达式:在数字/字符串上拆分字符串?

时间:2012-12-13 15:38:05

标签: php regex string split numbers

请考虑以下事项:

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*)

但这还不够。当我只有两个零件时,它就有用了。 (数字|字符串或字符串|数字),但如果我添加第三个"段"对它我不会工作。

有什么建议吗?

6 个答案:

答案 0 :(得分:5)

您可以使用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);

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

答案 1 :(得分:1)

可以使用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帖子。

答案 2 :(得分:1)

您正在寻找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

答案 3 :(得分:0)

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

仍然可以使用

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

答案 4 :(得分:0)

你可以使用这样的模式:

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

或者您可以使用preg_match_all这样的模式:

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

然后你可以匹配任意数量的段,每段只包含字母或仅包含数字。

答案 5 :(得分:0)

也许是这样的:

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

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