Php 同义词的preg_替换反向/相互替换

Php 同义词的preg_替换反向/相互替换,php,replace,preg-replace,str-replace,preg-replace-callback,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 sit ipsum,奉

我想相互或反向替换同义词。我必须举个例子告诉你:

$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,奉献精英

预期输出应如下所示: Lorem amet dolor坐在同侧,奉献精英

因此,我想将所有
ipsum
更改为
amet
,并将
amet
更改为
lorem
。“ipsum”和“amet”这两个词只是示例。我有成千上万的同义词


正如您所看到的,我尝试了
preg\u 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\u replace
的主要区别在于,当
str\u replace
(或
preg\u replace
)为每个项目解析字符串一次时,字符串只解析一次

例如,对您来说不是很有趣,但您可以使用
preg\u replace\u callback

$trans = ['ipsum' => 'amet', 'amet'=>'ipsum'];
$result = preg_replace_callback('~amet|ipsum~', function ($m) use ($trans) {
    return $trans[$m[0]]; }, $string);
如果要通过
str_replace
preg_replace
实现相同的效果,则需要使用占位符:

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

使用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\u replace
的主要区别在于,当
str\u replace
(或
preg\u replace
)为每个项目解析字符串一次时,字符串只解析一次

例如,对您来说不是很有趣,但您可以使用
preg\u replace\u callback

$trans = ['ipsum' => 'amet', 'amet'=>'ipsum'];
$result = preg_replace_callback('~amet|ipsum~', function ($m) use ($trans) {
    return $trans[$m[0]]; }, $string);
如果要通过
str_replace
preg_replace
实现相同的效果,则需要使用占位符:

$find = ['ipsum', 'amet', '###placeholder###'];
$replace = ['###placeholder###', 'ipsum', 'amet'];
$result = str_replace($find, $replace, $string);
我会叫一个像这样的

$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

我会叫一个像这样的

$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


您是否只有静态字符串要替换,而不是可能需要正则表达式的动态模式?@MichaelBerkowski存储数据库的静态字符串。您正在使用
strtr()
是否只有静态字符串要替换,而不是潜在的动态模式需要regex?@MichaelBerkowski存储数据库的静态字符串。您使用的
strtr()
工作正常,但我只需要匹配word。不使用此字符串
Lorem ipsum door sit amet,ipsumed adipising elit
,因为
ipsumed
单词将被替换
ameed
。我可以精确地匹配
preg\u replace
,因此使用
strtr
()“@Bora:使用
preg\u replace\u回调
preg\u replace
带单词边界的方法。感谢这三个解决方案,一切都很棒!我需要精确匹配单词。使用
preg\u replace\u callback
\b
word boundry现在非常有效,非常感谢。工作正常,但我只需要匹配单词。不使用此字符串
Lorem ipsum door sit amet,ipsumed adipising elit
,因为
ipsumed
单词将被替换
ameed
。我可以精确地匹配
preg\u replace
,因此使用
strtr
()“@Bora:使用
preg\u replace\u回调
preg\u replace
带单词边界的方法。感谢这三个解决方案,一切都很棒!我需要精确匹配word。使用
preg\u replace\u callback
\b
word boundry现在非常有用,非常感谢。