有没有办法替换匹配的指定出现?
我有一个字符串:
'1245'
'1 34 6'
'*-98 09'
我只想用'x'替换第二和第三位数,所以输出将是:
'1xx5'
'1 xx 6'
'*-9x x9'
php中有这样的功能/方式吗?
答案 0 :(得分:2)
您可以使用此正则表达式使用2个捕获组进行搜索。第一组捕获第二位数字之前的所有文本,第二组捕获第二和第三位数字之间的文本:
^(\D*\d\D*)\d(\D*)\d
将其替换为:
$1x$2x
<强>代码:强>
$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"
答案 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报告的比赛开始。这样做的好处是可以轻松扩展到两个以上的替代品。