PHP:如何正确创建数组版本此功能?

时间:2017-05-10 16:24:13

标签: php arrays function preg-replace case

$data = 'this is appLe and ApPle';
$search = 'apple'; //例如,想要使用$search如何使用多个单词$search = array("apple","pear")的数组 $replace = 'pear'; // $replace = array("pen","pupil")

如何将此函数转换为在$ search和$ replace中使用数组字?

$data = preg_replace_callback('/\b'.$search.'\b/i', function($matches) use ($replace)
{
   $i=0;
   return join('', array_map(function($char) use ($matches, &$i)
   {
      return ctype_lower($matches[0][$i++])?strtolower($char):strtoupper($char);
   }, str_split($replace)));
}, $data);

1 个答案:

答案 0 :(得分:1)

创建一个键值数组并使用这些键构建一个动态模式,以不区分大小写的方式将键作为整个单词匹配(或者甚至是一个简单的/\b\w+\b/正则表达式来匹配任何单词)并测试是否key存在于数组内(使用!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

请参阅PHP demo