2017-05-10 66 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