PHP正则表达式:如何在字符串的中间/结尾填充数字

PHP正则表达式:如何在字符串的中间/结尾填充数字,php,regex,zero-padding,Php,Regex,Zero Padding,我有一个JSON喷射的键=>值对列表。我对数组进行了排序,剩下的是以下内容(摘录相关案例,因为它们高达92个): 我需要做的是: 1) 将所有数字放在末尾和结尾处 2) 将它们填入2位数字(01、02和c) 因此,列表最终如下所示: directivesummary01 directivesummary10 directivesummarydue01 directivesummarydue10 directive01 directive10 directivecode01 directiveco

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

我需要做的是: 1) 将所有数字放在末尾和结尾处 2) 将它们填入2位数字(01、02和c) 因此,列表最终如下所示:

directivesummary01
directivesummary10
directivesummarydue01
directivesummarydue10
directive01
directive10
directivecode01
directivecode10
我本来希望用一个REGEX语句来实现这一点,但我迷路了。以下是我目前掌握的情况:

dir((\d{1,2}(summary|summarydue))|((ective\d{1,2})|(ectivecode\d{1,2})))
…啊,我不知道下一步该怎么办。如何继续前进?有没有更好的紧凑型方法

编辑:这也意味着我必须将“dir”替换为“directive”。结果表中暗示了这一点,但我没有为它做一个项目符号。此外,正则表达式是我能够构建的全部。因此,“失去了下一步该做什么”部分。

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


  • 在自定义函数中,使用硬编码
    指令
    ,然后附加捕获组#1(可能是空的),然后附加捕获组#3(也可能是空的),最后将pad capture group#2保留为零,最大长度为2位,并将该值附加到字符串末尾

代码:()

输出:

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

可以使用
preg\u replacecallback
在+10整数上修剪前导
0
。此外,将来共享的
regex101
regexer
链接将更有用。好的。这不仅解决了问题,而且解释得非常清楚和简单,以至于我学到的比我来这里学到的还要多@mickmackusa,你对regex的掌握很明显。谢谢你的时间和努力。非常感谢。哇…:d当您发布清晰的问题陈述、足够大的样本集、所需的输出和编码尝试时;你有一个非常吸引人的完整问题要回答。我不知道json喷射是什么,但这并不重要,因为所有的逻辑都被清楚地表达了。我很高兴能够慷慨地分享我对Stackoverflow.JSON squirt=通过POST或GET接收的JSON数组增值问题的知识。年轻时的威廉·吉布森太多了
$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',
)