preg_replace()似乎删除整个单词而不是它的一部分

时间:2012-01-09 11:03:11

标签: php regex string preg-replace

我正在尝试匹配某个单词,并用某些文字替换单词的一部分,但保留单词的其余部分。我的理解是,在正则表达式模式的一部分中添加括号意味着当您使用preg_replace()

时,括号内的模式匹配会被替换

出于测试目的我用过:

$text = 'batman';
echo $new_text = preg_replace('#(bat)man#', 'aqua', $text);

我只想用'aqua'代替'bat'来获得'aquaman'。相反,$new_text回应'aqua',而忽略了'man'部分。

4 个答案:

答案 0 :(得分:5)

preg_replace替换正则表达式匹配的所有字符串

$text = 'batman';
echo $new_text = preg_replace('#bat(man)#', 'aqua\\1', $text);

捕获man,然后将其附加到您的aqua前缀

另一种方法是使用断言:

$text = 'batman';
echo $new_text = preg_replace('#bat(?=man)#', 'aqua', $text);

答案 1 :(得分:3)

我不会使用preg_*函数来执行str_replace() DOCs

echo str_replace('batman', 'aquaman', $text);

这更简单,因为在这种情况下不需要正则表达式。否则它将使用正则表达式:

echo $new_text = preg_replace('#bat(man)#', 'aqua\\1', $text);

当替换整个搜索词组时,这会在man之后替换您的aquapreg_replace DOCs替换模式的整个匹配部分。

答案 2 :(得分:2)

你尝试这样做的方式更像是:

preg_replace('#bat(man)#', 'aqua$1', $text);

我使用positive lookahead

preg_replace('/bat(?=man)/', 'aqua', $text)

在这里演示:http://ideone.com/G9F4q

答案 3 :(得分:1)

括号正在创建一个捕获组,这意味着您可以使用\1访问该组匹配的部分。

你可以做任何zerkms建议或者使用只检查但不匹配的前瞻。

$text = 'batman';
echo $new_text = preg_replace('#bat(?=man)#', 'aqua', $text);

这将匹配“bat”,但前提是“man”,只更换“bat”。