2017-05-10 1 views
-1

$data = 'this is appLe and ApPle';
$search = 'apple'; // Zum Beispiel Kauf $search verwenden, wie Array mit vielen Worten $search = array("apple","pear")
$replace = 'pear'; // $replace = array("pen","pupil")
PHP: Wie Array-Version diese Funktion korrekt erstellen?

Wie konvertiert diese Funktion Array Worte in $ Suche zu verwenden und $ ersetzen?

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

Antwort

1

Erstellen Sie einen Schlüssel-Wert-Array und die Schlüssel verwenden, um ein dynamisches Muster zu bauen in einem Fall unempfindlich Weise (oder sogar eine einfache /\b\w+\b/ regex passen jedes Wort) und testen, ob die die Schlüssel als ganze Wörter entsprechen Schlüssel existiert innerhalb des Arrays (mit !empty($arr[strtolower($matches[0])])). Wenn es vorhanden ist, verarbeiten Sie andernfalls den gefundenen Übereinstimmungswert.

$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 

Siehe die PHP demo.

+1

Funktioniert gut, aber es gibt ein Problem .. Wenn ich ** Birne ** eingeben, funktioniert das Skript ein wenig falsch und als Antwort gibt ** PupiL ** und nicht ** Schüler **. Warum passiert dies? Und wie kann das korrigiert werden? Und wie macht man damit dieses Skript funktioniert und in anderen Kodierungen zB für ** Cyrillici **? – Otabek

+0

Ich glaube, Sie haben gefragt, nur Array-Unterstützung in * dieser * Frage hinzuzufügen. Wenn Sie eine andere haben, zögern Sie nicht zu fragen. Hier ist jedoch ein Hinweis: Um die Verarbeitung von Unicode-Strings hier zu ermöglichen, fügen Sie dem Regex einen 'u'-Modifizierer hinzu (' '/ \ b (?:'. Implode ("| |, array_keys ($ arr)). ') \ b/iu '; ') und ersetze alle' strto ... 'durch' mb_strto ... '. 'ctype_lower' kann auch durch' preg_match ('~^\ p {Ll} + \ z ~ u', $ m) 'ersetzt werden. –

+1

'$ data =' Alex hat viele Katzen zu Hause. '; $ search = Array ("Apfel", "Birne", "Alex"); $ ersetzen = Array ("Stift", "Schüler", "Александр"); $ search = array_map ("utf8_encode", $ search); $ replace = array_map ("utf8_encode", $ ersetzen); $ arr = array_combine ($ search, $ ersetzen); $ arr = array_map ("utf8_encode", $ arr); ' – Otabek