2017-05-10 9 views

答えて

1
$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); 

場合、キーと値の配列を作成し、(任意の単語に一致するように、あるいは単純/\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

うまく動作しますが、問題が1つあります。** Pear **と入力すると、スクリプトが正しく動作しなくなり、応答として** PupiL **と** Pupil **が返されます。なぜこうなった?どのようにこれを修正することができますか?そして、このスクリプトは** Cyrillici **のような他のコーディングでも動作するようにする方法は? – Otabek

+0

あなたは* this *の質問に配列サポートを追加するようにお願いしました。別の人がいる場合は、お気軽にお問い合わせください。しかし、ここではヒントがあります:Unicode文字列処理を有効にするには、正規表現に 'u '修飾子を追加してください。')/ \ b(?:implode(" | "、array_keys($ arr) b/iu '; ')、すべての' strto ... 'を' mb_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

関連する問題