我有带有数字短划线子字符串的字符串。我想找到这些子字符串,并在进行一些修改后替换它们。
例如,字符串类似于:
- 这是字符串编号123-45-6789-0,包含12-34567
现在我想找到数字短划线的子字符串(123-45-6789-0和12-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()
(。
我应该使用哪种模式和方法来实现这些目的?
提前谢谢。
您可以将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演示和regex演示。
d+(?:-d+)+
模式与匹配
d+
-1位以上数字- CCD_ 9-1次或多次出现CCD_
$m
是一个匹配数组,$m[0]
保存匹配值。对于explode
,字符串用-
拆分,然后数组反转,然后用implode
重新连接。