Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么preg_replace()将字符替换两次?_Php - Fatal编程技术网

Php 为什么preg_replace()将字符替换两次?

Php 为什么preg_replace()将字符替换两次?,php,Php,我试着用preg_replace来改变一堆单词。我之所以使用preg_replace而不是strpos,是因为它可以搜索我要替换的同一角色的多个场合。例如: $word = "abadi"; $patterns = array("/a/","/b/","/d/","/i/","/I/"); $replacements = array(" A"," B"," D"," I"," IY"); $word = preg_replace($patterns, $replacements, $word);

我试着用preg_replace来改变一堆单词。我之所以使用preg_replace而不是strpos,是因为它可以搜索我要替换的同一角色的多个场合。例如:

$word = "abadi";
$patterns = array("/a/","/b/","/d/","/i/","/I/");
$replacements = array(" A"," B"," D"," I"," IY");
$word = preg_replace($patterns, $replacements, $word);
var_dump ($word); // string ' A B A D  IY' (length=12)
我想所有的字符只改变一次。所以一旦小写的i被改成i,就不要再改成IY。有可能吗?

PHP的内置函数strtr更适合这种情况。使用此函数替换子字符串后,将不会再次搜索其新值

$translations = ['a' => 'A', 'b' => 'B', 'd' => 'D', 'i' => 'I', 'I' => 'IY' ];
$newString = strtr('abadi', $translations);
见定义:

string strtr ( string $str , array $replace_pairs )
如果给定两个参数,则第二个参数应为数组'from'=>'to',..形式的数组。。。。返回值是一个字符串,其中所有出现的数组键都已替换为相应的值。最长的钥匙将首先试用。替换子字符串后,将不再搜索其新值

$translations = ['a' => 'A', 'b' => 'B', 'd' => 'D', 'i' => 'I', 'I' => 'IY' ];
$newString = strtr('abadi', $translations);

<> PrTo的更多细节,请参阅.

您可能需要考虑模式和替换数组的顺序,在更新的字符串上顺序替换单词,这样可能会有帮助:

$word = "abadi";
$patterns = array("/I/", "/a/","/b/","/d/","/i/");
$replacements = array(" IY", " A"," B"," D"," I");
$word = preg_replace($patterns, $replacements, $word);
var_dump ($word);

问题是,大约20万个音素单词的$word可能包含多个小写、大写、标点符号、符号和数字。但我会努力的,谢谢你!不幸的是,它不起作用,仍然得到同样的东西