preg_replace子串在特定位置

时间:2018-01-15 10:33:04

标签: php regex

我有价值观,看起来像这样:

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);

但在这种情况下,我只是得到空值

1 个答案:

答案 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);