5

考虑以下:

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

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

有什么建议么?

4

6 回答 6

5

你可以preg_split改用。然后,您可以使用与单词和字母之间的位置匹配的环视

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

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

另一种方法(使用匹配函数)是在每次匹配时preg_match_all只使用和匹配数字或字母:

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

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

于 2012-12-13T15:43:53.857 回答
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);

?>

也检查这个帖子。

于 2012-12-13T15:49:19.193 回答
1

您正在寻找preg_split

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

演示

或者preg_match_all

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

演示

于 2012-12-13T15:56:15.887 回答
0

也许是这样的:

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

或者

(\d*)([a-zA-Z]*)(\d*)
于 2012-12-13T15:51:36.523 回答
0

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

您仍然可以使用拆分它

(?<=\d)(?=[a-zA-Z])|(?<=[a-zA-Z])(?=\d)
于 2012-12-13T15:44:04.797 回答
0

您可以使用这样的模式:

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

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

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

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

于 2012-12-13T15:47:31.367 回答