2009-11-20 15 views
14

Ich mache eine schwedische Website, und schwedische Buchstaben sind å, ä und ö.Wie Diakritika aus Text entfernen?

Ich muss eine Zeichenfolge eingeben, die von einem Benutzer eingegeben wird, um URL-sicher mit PHP zu werden.

Grundsätzlich müssen alle Zeichen konvertieren, um zu unterstreichen, alle außer diesen:

A-Z, a-z, 1-9 

und alle schwedischen sollte wie folgt umgewandelt werden:

‚A‘ bis ‚a‘ und ‚ä‘ zu 'a' und 'ö' bis 'o' (entfernen Sie einfach die Punkte oben).

Der Rest sollte Unterstreichungen werden, wie ich schon sagte.

Ich bin nicht gut in regulären Ausdrücken, so würde ich die Hilfe Jungs schätzen!

Dank

HINWEIS: NICHT urlencode ... Ich muss es in einer Datenbank speichern ... etc etc, urlencode wird nicht für mich arbeiten.

Antwort

13
// normalize data (remove accent marks) using PHP's *intl* extension 
$data = normalizer_normalize($data); 

// replace everything NOT in the sets you specified with an underscore 
$data = preg_replace("#[^A-Za-z1-9]#","_", $data); 
+4

Bitte erwähnen Sie, dass 'normalizer_normalize()' Teil der _intl_ PHP-Erweiterung ist, die nicht immer aktiv ist. Diese Erweiterung wurde dem Kern in PHP 5.3 hinzugefügt, aber in den meisten Linux-Distributionen ist sie standardmäßig nicht aktiv. Zum Beispiel ist es in Debian im separaten Paket _php5-intl_. Wenn Sie es nicht installieren/aktivieren können, versuchen Sie _ext/iconv_. stattdessen –

+1

@Mytskine Ich habe den Kommentar hinzugefügt. Danke, dass du darauf hingewiesen hast: Es war für mich mein Standard, also habe ich es nicht lange überlegt. –

4

Wenn Sie nur daran interessiert sind, Dinge URL sicher zu machen, dann wollen Sie urlencode.

Gibt eine Zeichenfolge zurück, in der alle nicht-alphanumerischen Zeichen außer -_. wurden durch ein Prozentzeichen (%) ersetzt, gefolgt von zwei Hexadezimalziffern und Leerzeichen, die als Pluszeichen (+) codiert sind. Es ist codiert auf die gleiche Weise, die verbuchte Daten aus einem WWW-Formular ist codiert, das ist die gleiche Weise wie in Anwendung/x-www-Form-urlencoded Medientyp. Dies unterscheidet sich von der » RFC 1738-Codierung (siehe rawurlencode()) dadurch, dass die Leerzeichen aus historischen Gründen als Pluszeichen (+) codiert sind.

Wenn Sie wirklich wollen, um alle nicht AZ, az Streifen, 1-9 (? Was übrigens mit 0, falsch ist), dann möchten Sie:

$mynewstring = preg_replace('/[^A-Za-z1-9]/', '', $str); 
+0

sorry, vergessen zu erwähnen, ich brauche nicht urlencode –

+1

Wenn Sie es sicher machen wollen, dann wollen Sie urlencode. Die Tatsache, dass Sie es in einer Datenbank speichern möchten, ist neben dem Punkt (abgesehen davon, dass Sie es für Ihre SQL-Einfügeabfrage entfliehen möchten, zusätzlich zur URL sicher machen). – Quentin

+0

Sie verstehen einfach nicht. Er möchte, dass es sicher als URL verwendet wird, aber nicht so sicher. Er würde es bevorzugen, wenn es auf einem Raum oder einem kaufmännischen Und-Zeichen fehlschlägt. – JohnFx

7

und alle schwedischen sollte wie folgt konvertiert werden:

'å' zu 'a' und 'ä' zu 'a' und 'ö' zu 'o' (entfernen Sie einfach die Punkte oben).

Verwenden Sie normalizer_normalize(), um diacritical marks loszuwerden.

Der Rest sollte Unterstreichungen werden, wie ich schon sagte.

Verwenden preg_replace() mit einem Muster von [\W] (i.o.w: jedes Zeichen, die keine Buchstaben, Ziffern übereinstimmen oder unterstreichen), sie zu ersetzen durch Unterstreichungen.

Endergebnis sollte wie folgt aussehen:

$data = preg_replace('[\W]', '_', normalizer_normalize($data)); 
1

Eine einfache Lösung str_replace Funktion mit Suche zu verwenden ist und Brief-Arrays zu ersetzen.

0

Sie brauchen keine Lust regexps die schwedischen Zeichen zu filtern, benutzen Sie einfach die strtr function zu "übersetzen" sie, wie:

$your_URL = "www.mäåö.com"; 
$good_URL = strtr($your_URL, "äåöë etc...", "aaoe etc..."); 
echo $good_URL; 

-> Ausgang: www.maao.com :)

+1

Es ist nur ein Alptraum, tausende von Charakteren zu bedecken, die in der menschlichen Welt bekannt sind. – BalusC

2

so einfach wie

$str = str_replace(array('å', 'ä', 'ö'), array('a', 'a', 'o'), $str); 
$str = preg_replace('/[^a-z0-9]+/', '_', strtolower($str)); 

vorausgesetzt, Sie verwenden die gleiche Codierung für Ihre Daten und Code.

+1

'/ [^ a-z0-9] +/i' oder '/ [^ A-Za-z0-9] + /' zum Ignorieren des Falls –

+0

strtr ist bequemer, um Zeichensätze zu "übersetzen", wie: $ str = strtr ($ str, "aëïöü", "aeiou"); Es verwendet keine Arrays – danii

+2

Arrays sind Cumbercome, um ein paar tausend Zeichen mit diakritischen Zeichen in der menschlichen Welt bekannt zu halten. Verwenden Sie einfach "Normalizer". – BalusC

18

Verwenden iconv in Strings aus einer bestimmten Codierung ASCII zu konvertieren, dann ersetzen nicht-alphanumerische Zeichen preg_replace mit:

$input = 'räksmörgås och köttbullar'; // UTF8 encoded 
$input = iconv('UTF-8', 'ASCII//TRANSLIT', $input); 
$input = preg_replace('/[^a-zA-Z0-9]/', '_', $input); 
echo $input; 

Ergebnis:

raksmorgas_och_kottbullar 
+1

Sie sollten "UTF-8" wie folgt verwenden: '$ data = iconv ('UTF-8', 'ASCII // TRANSLIT', $ data);' andernfalls könnte dieser Hinweis auftreten: "Falscher Zeichensatz, Konvertierung von 'UTF8 'zu' ASCII // TRANSLIT' ist nicht erlaubt " – Hirnhamster

+0

Bitte aktualisieren Sie Ihre Antwort, um @ Hirnhamsters Vorschlag einzuschließen. Ihr fehlender Bindestrich in 'UTF-8' betrifft andere Personen. – Timo

+0

@Timo: Danke für die Nachricht - Ich habe die Antwort jetzt aktualisiert. –

18

Dies sollte sinnvoll sein, die fast alle Griffe der Fälle.

function Unaccent($string) 
{ 
    return preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml|caron);~i', '$1', htmlentities($string, ENT_COMPAT, 'UTF-8')); 
} 
+1

Wie ein Charme! Danke – Oritm

+1

@Oritm willkommen. – user1518659

+1

Das sieht toll aus, hat aber Probleme mit zum Beispiel griechischen Zeichen –

0

Wenn intl PHP-Erweiterung aktiviert ist, können Sie Transliterator wie folgt verwenden:

protected function removeDiacritics($string) 
{ 
    $transliterator = \Transliterator::create('NFD; [:Nonspacing Mark:] Remove; NFC;'); 
    return $transliterator->transliterate($string); 
} 

andere Sonderzeichen zu entfernen (nicht diakritischen Zeichen nur wie 'æ')

protected function removeDiacritics($string) 
{ 
    $transliterator = \Transliterator::createFromRules(
     ':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: NFC;', 
     \Transliterator::FORWARD 
    ); 
    return $transliterator->transliterate($string); 
} 
Verwandte Themen