preg_replace reverse/mutual 替换同义词

preg_replace reverse/mutual replacing on synonyms words

我想对同义词进行相互替换或反向替换。不得不举个例子告诉大家:

$string = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit';
$find = array('/ipsum/', '/amet/');
$replace = array('amet', 'ipsum');
$output = preg_replace($find, $replace, $string);

输出为:

Lorem ipsum dolor sit ipsum, consectetur adipiscing elit

预期输出应该是这样的:

Lorem amet dolor sit ipsum, consectetur adipiscing elit

所以我想将所有 ipsum 更改为 amet,将 amet 更改为 lorem。 "ipsum" 和 "amet" 只是采样的这两个词。我有几千个同义词。

如您所见,我尝试了 preg_replace 功能但确实有效。

使用strtr:

$string = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit';
$find = array('ipsum', 'amet');
$replace = array('amet', 'ipsum');
$trans = array_combine($find, $replace);

$result = strtr($string, $trans);

str_replace 的主要区别是字符串只被解析一次,而 str_replace(或 preg_replace)对每个项目解析一次。

你的例子不是很有趣,但你可以用 preg_replace_callback:

$trans = ['ipsum' => 'amet', 'amet'=>'ipsum'];
$result = preg_replace_callback('~amet|ipsum~', function ($m) use ($trans) {
    return $trans[$m[0]]; }, $string);

如果您想使用 str_replacepreg_replace 实现相同的效果,您需要使用占位符:

$find = ['ipsum', 'amet', '###placeholder###'];
$replace = ['###placeholder###', 'ipsum', 'amet'];
$result = str_replace($find, $replace, $string);

我会这样调用 preg_replace_callback()

$string = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit';
$reverse = preg_replace_callback('/\b(ipsum|amet)\b/', function($matches) {
    return $matches[0] == 'ipsum' ? 'amet' : 'ipsum';
}, $string);
//Lorem amet dolor sit ipsum, consectetur adipiscing elit

Use word boundary (\b) around, if you want to match exact word only.