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_replace
或 preg_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.
我想对同义词进行相互替换或反向替换。不得不举个例子告诉大家:
$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_replace
或 preg_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.