仅替换PHP中指定的事件

仅替换PHP中指定的事件,php,regex,Php,Regex,是否有方法替换指定的匹配项 我有一个字符串: '1245' '1 34 6' '*-98 09' 我只想用“x”替换第二位和第三位数字,因此输出为: '1xx5' '1 xx 6' '*-9x x9' php中有这样的函数/方法吗?您可以使用这个带有2个捕获组的正则表达式进行搜索。第一组捕获第二位之前的所有文本,第二组捕获第二位和第三位之间的文本: ^(\D*\d\D*)\d(\D*)\d 替换为: $1x$2x 代码: $repl = preg_replace('/^(\D*\d\D

是否有方法替换指定的匹配项

我有一个字符串:

'1245'
'1 34 6'
'*-98 09'
我只想用“x”替换第二位和第三位数字,因此输出为:

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

php中有这样的函数/方法吗?

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

^(\D*\d\D*)\d(\D*)\d
替换为:

$1x$2x

代码:

$repl = preg_replace('/^(\D*\d\D*)\d(\D*)\d/m', '$1x$2x', $str);
^        # 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
正则表达式分解:

$repl = preg_replace('/^(\D*\d\D*)\d(\D*)\d/m', '$1x$2x', $str);
^        # 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

使用
preg\u replace\u回调
函数的解决方案:

$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"

另一种使用limit of和regex的方法


  • (?迭代每个字符并检查是否为数字查看此演示:。正则表达式似乎吃得太多了。@bobble bubble ok,如果我只想匹配结尾的前三位,该怎么办?F.e.输入“-876 832 09”应该变成“-876 xxx 09”@Stephan这是用于限制像@user7201963这样的单行字符串的这是非常不同的。你可以尝试(不受preg限制)@bobble bubble有没有办法从末尾开始计算mtach?比如-替换第二位和第三位,但从末尾开始(右)?我不知道是否会出现这种情况,但如果只有2位数字,则无法替换第二位数字,字符串至少需要3位数字才能工作。因为OP编写了我只想替换第二位和第三位数字,这意味着必须至少有3位数字才能完成此替换。