PHP:查找数字-虚线子字符串并在修改后替换的方式是什么?

问题描述 投票:0回答:1

我有带数字-破折号子字符串的字符串。我想找到这些子字符串,并在进行一些修改后将其替换。

例如,字符串类似于:

  • 这是字符串号123-45-6789-0,其中包含12-34567

现在,我想找到数字破折号的子字符串(123-45-6789-012-34567),并用修改后的子字符串替换。例如,最终的字符串将如下所示:

  • 这是修改后的字符串号0-6789-45-123,其中包含34567-12

我已经尝试过:preg_match_all(string $pattern, string $subject, array &$matches)

  • $pattern = '/-*\d+-*/';

但是它给了我一个数字数组,每个数字都有一个破折号,就像这样:

  • $matches = [123-, 45-, 6789-, 0, 12-, 34567]

而我想要一个由两个子字符串组成的数组,如下所示:

  • $matches = [0 => 123-45-6789-0, 1 => 12-34567]

为了分别进行修改和替换(使用str_replace())。

我应为此目的使用哪种模式和方法?

提前感谢。

php regex substring preg-match-all
1个回答
0
投票

您可以将\d+(?:-\d+)+正则表达式与preg_replace_callback`函数一起使用:

$str = 'This is the string number 123-45-6789-0 which contains 12-34567.';
echo preg_replace_callback('~\d+(?:-\d+)+~', function($m) { 
    return implode('-', array_reverse(explode('-', $m[0]))); }
,$str);
// => This is the string number 0-6789-45-123 which contains 34567-12.

请参见PHP demo

\d+(?:-\d+)+模式匹配

  • \d+-1个以上的数字
  • [(?:-\d+)+--和1+个数字序列出现1个或更多。
© www.soinside.com 2019 - 2024. All rights reserved.