PHP替换为空,或者不替换

时间:2014-01-31 23:21:12

标签: php regex preg-replace

我正在尝试用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

  • 注意:我需要一个正则表达式解决方案,这适用于其他类似的问题。

2 个答案:

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