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现在非常有用,非常感谢。