我正在尝试匹配某个单词,并用某些文字替换单词的一部分,但保留单词的其余部分。我的理解是,在正则表达式模式的一部分中添加括号意味着当您使用preg_replace()
出于测试目的我用过:
$text = 'batman';
echo $new_text = preg_replace('#(bat)man#', 'aqua', $text);
我只想用'aqua'代替'bat'来获得'aquaman'。相反,$new_text
回应'aqua',而忽略了'man'部分。
答案 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
之后替换您的aqua
。 preg_replace
DOCs替换模式的整个匹配部分。
答案 2 :(得分:2)
你尝试这样做的方式更像是:
preg_replace('#bat(man)#', 'aqua$1', $text);
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”。