我正在尝试用PHP替换字符串中的第一个数字,但行为与表现不符。
$str = 'A12:B17';
$newvalue = '987';
echo preg_replace('/(^[A-Za-z])\d+(.*)/', '\1'.$newvalue.'\2', $str);
当我把它单独放置时,问题是\ 1被很好地替换了,但是当我把$ newvalue和\ 2时,第一个\ 1被忽略
INPUT1:
echo preg_replace('/(^[A-Za-z])\d+(.*)/', '\1'.$newvalue.'\2', $str);
OUTPUT1:
87:B17 // dissapears first character :/
输入2:
echo preg_replace('/(^[A-Za-z])\d+(.*)/', '\1'.$newvalue.'\2', $str);
OUTPUT2:
A
期望的结果:
A987:B17
答案 0 :(得分:3)
您可以使用:
echo preg_replace('/(^[A-Za-z])\d+(.*)/', '${1}' . $newvalue . '${2}', $str);
//=> OUTPUT: A987:B17
问题是,在您的代码中,引用变量\1
变为\1987
,这就是显示空值的原因。 ${1}
将其与987
分开,因此值已被正确替换。
答案 1 :(得分:1)
anubhava's answer很棒,但您也可以像这样使用lookbehind assertion:
echo preg_replace('/(?<=^[A-Za-z])\d+/', $newvalue, $str);
lookbehind确保匹配的字符串(\d+
)紧跟在与模式^[A-Za-z]
匹配的字符串之后。但是,与原始版本不同,匹配中不会捕获与后视相匹配的字符串部分,因此整个匹配为12
。
只是为了提供另一种解决方案,您还可以使用回调:
echo preg_replace_callback('/(^[A-Za-z])\d+/', function($m) use (&$newvalue) {
return $m[1].$newvalue;
}, $str);