PHP REGEX:如何在字符串的中间/末尾填充数字



我有一个JSON喷射的key=>值对列表。我对数组进行了排序,留下了以下内容(摘录了相关案例,因为它们高达92(:

dir1summary
dir10summary
dir1summarydue
dir10summarydue
directive1
directive10
directivecode1
directivecode10

我需要做的是:1( 将所有数字放在末尾2( 将它们填充到2位(01,02,&c(所以列表最后看起来是这样的:

directivesummary01
directivesummary10
directivesummarydue01
directivesummarydue10
directive01
directive10
directivecode01
directivecode10

考虑到密钥名称的明显相似性,我希望用一个REGEX语句来实现这一点,但我迷路了。到目前为止,我拥有的是:

dir((d{1,2}(summary|summarydue))|((ectived{1,2})|(ectivecoded{1,2})))

啊,我不知道下一步该怎么办了。如何继续?有更好的compact方法吗?

EDIT:这也意味着我必须用"directive"替换"dir"。它隐含在结果列表中,但我没有为它做一个项目符号。此外,REGEX是我在RegExer所能构建的全部。因此,"失去了下一步该做什么"的部分。

  • 匹配但不捕获dir
  • 匹配但不捕获可选子字符串ective
  • ective之后立即保留零个或多个非数字字符作为捕获组#1(这说明了可选的子字符串,如summarydue(
  • 将整个整数保留为捕获组#2
  • 将字符串的其余部分保留为捕获组#3

  • 在自定义函数中,对directive进行硬编码,然后附加捕获组#1(可能为空(,再附加捕获组#3(也可能为空

代码:(演示(

$strings = [
'dir1summary',
'dir10summary',
'dir1summarydue',
'dir10summarydue',
'directive1',
'directive10',
'directivecode1',
'directivecode10',
];
var_export(
preg_replace_callback(
'/dir(?:ective)?(D*)(d+)(.*)/',
function ($m) {
return "directive{$m[1]}{$m[3]}" . str_pad($m[2], 2, "0", STR_PAD_LEFT);
},
$strings
)
);

输出:

array (
0 => 'directivesummary01',
1 => 'directivesummary10',
2 => 'directivesummarydue01',
3 => 'directivesummarydue10',
4 => 'directive01',
5 => 'directive10',
6 => 'directivecode01',
7 => 'directivecode10',
)

或者,您可以使用sscanf()解析字符串,然后使用printf()以所需格式打印隔离组件。

代码:(演示(

foreach ($strings as $string) {
sscanf($string, '%[^0-9]%d%s', $dir, $num, $str);
printf("%s%s%02dn", str_pad($dir, 9, 'ective'), $str, $num);
}
// same result strings as above

最新更新