2016-04-15 13 views
1

Ich versuche, Akzente aus einer Zeichenfolge zu entfernen und schrieb die folgende Funktion in PHP, aber es entfernt sie nicht. String geht mit Akzenten und wird mit Akzenten zurückgegeben.Versuchen, Akzente von String in PHP zu entfernen

function stripaccents($string) 
{ 
    $replace = array('é','í','ó','á','ñ', 'ú', 'ü'); 
    $with = array('e','i','o','a', 'n', 'u', 'u'); 

    foreach ($replace as &$char) 
    { 
     $char = utf8_decode($char); 
    } 
    unset($char); 

    $newstring = str_replace($replace, $with, $string); 

    return $newstring; 
} 
+0

ich denke, es sollte funktionieren, wenn Sie die foreach/ungesetzt entfernen. Der Aufruf utf8_decode könnte Ihre Ersatzzeichen durcheinander bringen. – JimL

+0

Die Schlüsselfrage ist, warum Sie glauben, dass Sie die Akzente entfernen müssen Verwenden Sie UTF-8 konsequent, und Sie sollten keine Probleme mit ihnen haben –

+0

Wanda, zeigen Sie die Eingabezeichenfolge – RomanPerekhrest

Antwort

1

Wenn Sie PHP 5.3 oder höher verwenden (was Sie sein sollte), die eingebaute Funktion verwenden:

$newstring = normalizer_normalize($oldstring); 
+0

Ich kannte diese Funktion nicht. Wie funktioniert es im Vergleich zu, sagen wir [Patchwork UTF-8] (https://github.com/tchwork/utf8)? –

+0

@GrasDouble Es ist Teil des Intl-Pakets. Es funktioniert gut - vor allem für die Konvertierung kurzer Zeichenketten in ASCII. – kainaw

1

Sie auch iconv

$newstring = iconv('UTF-8', 'ASCII//TRANSLIT', $string); 
+3

Ich habe diese Methode ausprobiert und sie hat mein "reír" in "re'ir" verwandelt. –

0

Da Sie verwenden können‘ Wenn Sie speziell nach spanischen Zeichen suchen, können Sie mit einem regulären Ausdruck nach folgenden Zeichen suchen:

function stripaccents($string) 
{ 
    $replace = array('/é/','/í/','/ó/','/á/','/ñ/', '/ú/', '/ü/'); 
    $with = array('e','i','o','a', 'n', 'u', 'u'); 

    $newstring = preg_replace($replace, $with, $string); 

    return $newstring; 
} 

Ansonsten können Sie eine der anderen bereits genannten Funktionen verwenden.

+0

Danke! Das scheint zu funktionieren! –

+0

@WandaEmbar, obwohl Sie eine Bibliothek wie [Patchwork UTF-8] (https://github.com/tchwork/utf8) oder [Stringy] (https://github.com/danielstjules/Stringy) besser verwenden könnten . –

0

Ich glaube, Sie brauchen nicht

foreach ($replace as &$char) 
    { 
     $char = utf8_decode($char); 
    } 
    unset($char); 

Da utf8_decode

0

Hier zu konvertieren 2-Byte-Werte von $ ersetzen-1 Byte-Wert versuchen, ist ein Brauch ich verwende.

function remove_accents($str, $charset = 'utf-8') { 
    $str = htmlentities($str, ENT_NOQUOTES, $charset); 
    $str = preg_replace('#&([A-za-z])(?:acute|cedil|caron|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str); 
    $str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str); 
    $str = preg_replace('#&[^;]+;#', '', $str); 
    return $str; 
} 
Verwandte Themen