PHP:如何正确创建该函数的数组版本?

PHP:如何正确创建该函数的数组版本?,php,arrays,function,preg-replace,case,Php,Arrays,Function,Preg Replace,Case,$data='这是苹果和苹果' $search='apple'//例如,想要使用$search如何使用多个单词的数组$search=array(“苹果”、“梨”) $replace='pear'/$replace=数组(“笔”、“瞳孔”) 如何将此函数转换为在$search和$replace中使用数组字? 创建一个键值数组,并使用这些键构建一个动态模式,以不区分大小写的方式(甚至是一个简单的/\b\w+\b/regex来匹配任何单词)将这些键作为整个单词进行匹配,并测试该键是否存在于数组中(使用

$data='这是苹果和苹果'
$search='apple'
//例如,想要使用
$search
如何使用多个单词的数组
$search=array(“苹果”、“梨”)

$replace='pear'/
$replace=数组(“笔”、“瞳孔”)

如何将此函数转换为在$search和$replace中使用数组字?
创建一个键值数组,并使用这些键构建一个动态模式,以不区分大小写的方式(甚至是一个简单的
/\b\w+\b/
regex来匹配任何单词)将这些键作为整个单词进行匹配,并测试该键是否存在于数组中(使用
!empty($arr[strtolower($matches[0])
)。如果存在,则处理,否则,使用找到的匹配值

$data    = 'this is appLe and ApPle and also a pEar here'; 
$search = array("apple","pear");
$replace = array("pen","pupil");
$arr = array_combine($search, $replace);
$pat = '/\b(?:' . implode("|", array_keys($arr)) . ')\b/i';
$data = preg_replace_callback($pat, function($matches) use ($arr)
{
   $i=0;
   return !empty($arr[strtolower($matches[0])]) ? join('', array_map(function($char) use ($matches, &$i)
   {
      return ctype_lower($matches[0][$i++])?strtolower($char):strtoupper($char);
   }, str_split($arr[strtolower($matches[0])]))) : $matches[0];
}, $data);
echo $data; // => this is pen and PeN and also a pUpiL here

请参阅。

工作正常,但有一个问题。。当我输入Pear时,脚本工作有点不正确,作为回应,它给出了瞳孔而不是瞳孔。为什么会这样?如何纠正这一点?以及如何使该脚本在其他编码(例如Cyrillici)中工作?我想您要求在这个问题中只添加数组支持。如果您还有其他问题,请随时询问。但是,这里有一个提示:要在这里启用Unicode字符串处理,请在正则表达式中添加一个
u
修饰符(
'/\b(?:'.intlode(“|“),array_key($arr))。)\b/iu';
)并将所有
strto…
替换为
mb\u strto…
ctype_lower
也可以替换为
preg_match(“~^\p{Ll}+\z~u',$m)
“$data=”Alex家里有很多猫“$搜索=数组(“苹果”、“梨”、“亚历克斯”)$替换=阵列(“笔”、“瞳孔”、“瞳孔”)$搜索=数组映射(“utf8编码”,$search)$replace=数组映射(“utf8\u编码”,$replace)$arr=数组与组合($search,$replace)$arr=数组映射(“utf8\u编码”,$arr);'<代码>$pat='/\b(?:'.内爆(“|”,数组_键($arr))。\b/iu'$hint=preg_replace_callback($pat,function($matches)use($arr){$i=0;return!empty($arr[mb_strtolower($matches[0]))?join(“”,array_map(function($char)use($matches,&$i){return ctype_lower($matches[0][$i++]))?mb strtolower($char mb strtouper($char split($arr[mb[mb[mb]$data=mb_convert_编码($data,“UTF-8”)
ctype\u lower
不处理Unicode字母。我不确定你是否需要它。无论如何,这已经是另一个问题了。
$data    = 'this is appLe and ApPle and also a pEar here'; 
$search = array("apple","pear");
$replace = array("pen","pupil");
$arr = array_combine($search, $replace);
$pat = '/\b(?:' . implode("|", array_keys($arr)) . ')\b/i';
$data = preg_replace_callback($pat, function($matches) use ($arr)
{
   $i=0;
   return !empty($arr[strtolower($matches[0])]) ? join('', array_map(function($char) use ($matches, &$i)
   {
      return ctype_lower($matches[0][$i++])?strtolower($char):strtoupper($char);
   }, str_split($arr[strtolower($matches[0])]))) : $matches[0];
}, $data);
echo $data; // => this is pen and PeN and also a pUpiL here