2017-05-10 35 views
-1

$data = 'this is appLe and ApPle';
$search = 'apple'; //例如,一个想使用$search如何阵列用许多话$search = array("apple","pear")
$replace = 'pear'; // $replace = array("pen","pupil")
PHP:如何正确创建数组版本这个函数?

如何转换这个函数使用数组的话在$搜索和$替换?

$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

创建一个键 - 值阵列,并使用密钥来生成动态模式来匹配在不区分大小写的方式键作为整个单词(或甚至简单的/\b\w+\b/正则表达式匹配任何字)和测试,如果键存在于数组内(与!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

+1

工作正常,但有一个问题。当我输入** Pear **时,脚本工作有点不正确,回应给出** PupiL **而不是**瞳孔**。这是为什么发生?如何纠正?以及如何使这个脚本工作,并在其他编码例如** Cyrillici **? – Otabek

+0

我想你只是在* this *问题中添加数组支持。如果你有另一个,请随时问。但是,这里有个提示:为了在这里启用Unicode字符串处理,在正则表达式中添加一个'u'修饰符(''/ \ b(?:'。implode(“|”,array_keys($ arr))。')\ b/iu';')并用'mb_strto ...'替换所有的'strto ...'。 'ctype_lower'也可以用'preg_match('〜^ \ p {Ll} + \ z〜u',$ m)'替换。 –

+1

'$ data ='亚历克斯家里有很多猫。'; $ search = array(“apple”,“pear”,“alex”); $ replace = array(“pen”,“pupil”,“александр”); $ search = array_map(“utf8_encode”,$ search); $ replace = array_map(“utf8_encode”,$ replace); $ arr = array_combine($ search,$ replace); $ arr = array_map(“utf8_encode”,$ arr);' – Otabek