我有一系列形式为
的字符串10a99b5c
55
2a3b1
g
如何按字符拆分字符串(这些字符始终显示为数字之间或字符串的开头/结尾中的单个字符)
array([0] => 10a99b5c, [1] => 10, [2]=> a99, [3] => b5, [4] => c),
array([0] => 55, [1] => 55),
array([0] => 2a3b1, [1] => 2, [2] => a3, [3] => b1),
array([0] => g, [1] => g),
输出格式并不重要,我可以处理,我只是不知道什么样的正则表达式模式可以做到这一点(即使提示就足够了)。
我使用
preg_replace_callback
执行此操作,其中我使用为每个字符找到的数字进行一组计算。
试试这个:
$input = ['10a99b5c','55','2a3b1','g'];
$regEx = '~([a-z]\d*)~';
foreach($input as $str){
$res[] = preg_split($regEx,$str,-1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
}
echo '<pre>';
var_export($res);
上述示例的结果:
array (
0 =>
array (
0 => '10',
1 => 'a99',
2 => 'b5',
3 => 'c',
),
1 =>
array (
0 => '55',
),
2 =>
array (
0 => '2',
1 => 'a3',
2 => 'b1',
),
3 =>
array (
0 => 'g',
),
)
您的任务很简单,在每个数字序列后面的零宽度位置进行分割。
$array = preg_split('/\d+\K/', $string, 0, PREG_SPLIT_NO_EMPTY);
用
\d+
匹配数字,然后用\K
释放它们,这样数字在爆炸过程中就不会被“消耗”。
我会将您的四个示例字符串捆绑到测试字符串数组中。
代码:(演示)
$strings = [
'10a99b5c',
'55',
'2a3b1',
'g',
];
var_export(
array_map(
fn($string) => preg_split('/\d+\K/', $string, 0, PREG_SPLIT_NO_EMPTY),
$strings
)
);
输出:
array (
0 =>
array (
0 => '10',
1 => 'a99',
2 => 'b5',
3 => 'c',
),
1 =>
array (
0 => '55',
),
2 =>
array (
0 => '2',
1 => 'a3',
2 => 'b1',
),
3 =>
array (
0 => 'g',
),
)