我有价值观,看起来像这样:
Point_10_5_80_...
Point_22_21_77_...
点意味着模式继续存在。这些值在我的代码中充当模板。我希望能够只替换每个模板中的第二个数字:
Point_10_5_80_... -> Point_10_777_80_...
Point_22_21_77_... -> Point_22_888_77_...
因此,在第一个模板5中被替换为777,而在第二个模板中,21被替换为888.我不知道如何使用preg_replace来实现它。我试过了
$values = preg_replace('(Point_\d+_)(\d+)([_0-9]+)','$1' . $replacement . '$3', $template);
但在这种情况下,我只是得到空值
答案 0 :(得分:1)
您的代码有两个错误:首先,您没有逃避您的模式。为此,你可以使用斜杠:$pattern = '/(Point_\d+_)\d+((?:_\d+)*)/'
(模式相当于你的模式,我只是改了它)
另一个问题是,您的$replacement
变量本身会包含一个数字。因此,通过将其与$1
和$2
连接,您将获得类似$1777$2
的内容。这是红色的:取第17组,添加数字77,然后添加第2组,这不是你想要的。这是因为最多有100个组(0~99),如果提供的话,组标识符总是需要两位数。要解决此问题,请为您的组添加0:' $01' . $replacement . '$02'
前缀以提供两位数字。 (第2组并不是必需的,因为你不会在它后面添加任何数字。)
您的代码可能如下所示:
$array = ['Point_10_5_80_111','Point_22_21_77_222','Point_21_55_77_222'];
$replacements = [777, 888, 999];
$pattern = '/(Point_\d+_)\d+((?:_\d+)*)/';
$values = array_map(function($string, $replacement) use ($pattern) {
return preg_replace($pattern, '$01' . $replacement . '$02', $string);
}, $array, $replacements);