【问题标题】:PHP REGEX: how to pad numbers in the middle/end of a stringPHP REGEX:如何在字符串的中间/结尾填充数字
【发布时间】:2020-06-16 13:00:25
【问题描述】:

我有一个来自 JSON squirt 的键=>值对列表。我对数组进行了排序,剩下以下内容(摘录相关案例,因为它们高达 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))|((ective\d{1,2})|(ectivecode\d{1,2})))

...aaaand 我不知道下一步该做什么。如何继续前进?有没有更好的 compact 方法来做到这一点?

编辑:这也意味着我必须用“指令”替换“目录”。它隐含在结果列表中,但我没有为它制作项目符号。此外,正则表达式是我能够在RegExer 构建的所有内容。因此“失去了下一步该做什么”部分。

【问题讨论】:

  • 也许regex101.com/r/OtWHmC/2preg_replacecallback 可以在+10 整数上修剪前导0。同样在未来共享regex101regexer 链接会更有用。

标签: php regex zero-padding


【解决方案1】:
  • 匹配但不捕获dir
  • 匹配但不捕获可选子字符串ective
  • ective 之后立即保留零个或多个非数字字符作为捕获组 #1(这考虑了诸如 summarydue 之类的可选子字符串)
  • 保留整个整数作为捕获组 #2
  • 保留字符串的其余部分作为捕获组#3


  • 在自定义函数中,硬编码directive,然后追加捕获组#1(可能为空),然后捕获组#3(也可能为空),最后在捕获组#2 中添加一个零到最大长度为 2 位,并将该值附加到字符串的末尾

代码:(Demo)

$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',
)

【讨论】:

  • 好的。这不仅解决了,而且解释得如此简单明了,以至于我学到的东西比我来这里的还要多! @mickmackusa,您对正则表达式的明显掌握很清楚。感谢您的时间和精力。非常感谢。哇...:D
  • 当您发布明确的问题陈述、足够大的样本集、所需的输出和编码尝试时;你有一个完整的问题,很有吸引力。我不知道什么是 json squirt,但这并不重要,因为所有的逻辑都被清楚地表达了。我很高兴能慷慨地分享我在为 Stackoverflow 增加价值的问题上的知识。
  • JSON squirt = 通过 POST 或 GET 接收的 JSON 数组。威廉·吉布森年轻时太多了。 ;)
猜你喜欢
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多