请考虑以下事项:
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*)
但这还不够。当我只有两个零件时,它就有用了。 (数字|字符串或字符串|数字),但如果我添加第三个"段"对它我不会工作。
有什么建议吗?
答案 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
)
preg_match_all('(\d+|\D+)', $test, $matches) && $matches = $matches[0];
答案 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*)