preg_replace对同义词进行反向/相互替换

时间:2015-12-23 13:55:25

标签: php replace preg-replace str-replace preg-replace-callback

我希望在同义词上相互替换或反向替换。我必须举个例子来告诉你:

$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坐ipsum,consectetur adipiscing elit

预期输出应该是这样的:

  

Lorem amet dolor坐ipsum,consectetur adipiscing elit

所以我想将所有ipsum更改为amet,将amet更改为lorem。这两个词“ipsum”和“amet”只是样本。我有成千上万的同义词。

就像你看到的那样,我尝试了preg_replace功能但是做得很好。

2 个答案:

答案 0 :(得分:3)

使用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);

答案 1 :(得分:0)

我会像这样叫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
  

如果您只想匹配确切的单词,请使用单词边界(\b)。