我有带数字-破折号子字符串的字符串。我想找到这些子字符串,并在进行一些修改后将其替换。
例如,字符串类似于:
现在,我想找到数字破折号的子字符串(123-45-6789-0和12-34567),并用修改后的子字符串替换。例如,最终的字符串将如下所示:
我已经尝试过: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()
)。
我应为此目的使用哪种模式和方法?
提前感谢。
您可以将\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个或更多。