在PHP中仅替换指定的出现次数

时间:2016-11-26 11:01:17

标签: php regex

有没有办法替换匹配的指定出现?

我有一个字符串:

'1245'
'1 34 6'
'*-98 09'

我只想用'x'替换第二和第三位数,所以输出将是:

'1xx5'
'1 xx 6'
'*-9x x9'

php中有这样的功能/方式吗?

3 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式使用2个捕获组进行搜索。第一组捕获第二位数字之前的所有文本,第二组捕获第二和第三位数字之间的文本:

^(\D*\d\D*)\d(\D*)\d

将其替换为:

$1x$2x

RegEx Demo

<强>代码:

$repl = preg_replace('/^(\D*\d\D*)\d(\D*)\d/m', '$1x$2x', $str);

RegEx分手:

^        # start
(        # start captured group #1
   \D*   # match 0 or more non-digits
   \d    # match 1st digit
   \D*   # match 0 or more non-digits
)        # end captured group #1
\d       # match 2nd digit
(        # start captured group #2
   \D*   # match 0 or more non-digits
)        # end captured group #2
\d       # match 3rd digit

答案 1 :(得分:1)

使用preg_replace_callback函数的解决方案:

$str = '*-98 09';
$count = 0;

$replaced = preg_replace_callback("/\d/", function ($m) use(&$count){
    return (++$count == 1)? $m[0] : 'x';  // replace excepting the first digit
}, $str, 3);

print_r($replaced);

输出:

"*-9x x9"

http://php.net/manual/en/function.preg-replace-callback.php

答案 2 :(得分:1)

使用preg_replace的限制和使用lookbehind的正则表达式的另一种方法。

$str = ['1245', '1 34 6', '*-98 09'];
$str = preg_replace('/(?<=\d)\D*\K\d/', "x", $str, 2);

See demo at eval.in  print_r($str);

Array
(
    [0] => 1xx5
    [1] => 1 xx 6
    [2] => *-9x x9
)
    如果有数字,
  • (?<=\d)会落后。
  • \D*匹配任意数量的非数字。
  • \K resets报告的比赛开始。

这样做的好处是可以轻松扩展到两个以上的替代品。