2010-10-29 20 views
10

PHP regulären Ausdruck Skript, um alles zu entfernen, die nicht ein alphabetischer Buchstabe oder Nummer 0 bis 9 und Leerzeichen an einen Bindestrich ersetzen - ändern Sie in Kleinbuchstaben stellen Sie sicher, es gibt nur einen Bindestrich - zwischen Wörtern nein - oder --- usw.Regulärer Ausdruck - jeder Text zu URL freundlich

Zum Beispiel:

Beispiel: der schnelle braune Fuchs sprang Ergebnis: the-quick-braun-Fuchs sprang

Beispiel: der schnelle braune Fuchs sprang ! Resultat: der-schnelle-braune-fuchs-gesprungene

Beispiel: Der schnelle braune Fuchs - gesprungen! Ergebnis: the-quick-braun-Fuchs sprang

Beispiel: Der schnelle ~ `@ # $%^& *() _ + = ------- braun {} |] [:“ ?.! ‚; <>,/Fuchs - sprang Ergebnis: the-quick-braun-Fuchs sprang

Beispiel: der schnelle 1234567890 ~` @ # $%^& *() _ + = - ----- braun {} |] [: ''; <>?.,/Fox - gesprungen! Ergebnis: the-quick-1234567890-braun-Fuchs springt


Jede Idee für den regulären Ausdruck hat?

Danke!

+0

Vielleicht möchten Sie Bindestriche hinterlassen, wenn sie direkt zwischen Wörtern sind (zB "etwas" sollte nicht zu "etwas" übersetzt werden) und anderen Sonderfällen. –

Antwort

27

Da Sie scheinen alle Sequenzen von nicht-alphanumerischen Zeichen zu wollen, durch einen Bindestrich ersetzt werden, können Sie diese verwenden:

$str = preg_replace('/[^a-zA-Z0-9]+/', '-', $str); 

Aber in Vorder- oder Hinter Bindestriche führen kann, dass sein können entfernt mit trim:

$str = trim($str, '-'); 

Und das Ergebnis in Klein zu konvertieren, verwenden strtolower:

$str = strtolower($str); 

Also alles zusammen:

$str = strtolower($str); 
$str = trim($str, '-'); 
$str = preg_replace('/[^a-z0-9]+/', '-', $str); 

Oder in einem kompakten Einzeiler:

$str = strtolower(trim(preg_replace('/[^a-zA-Z0-9]+/', '-', $str), '-')); 
+0

Danke! Funktioniert super! – Paul

+2

Ich denke, eine bessere Alternative ist zuerst Whitespace, dann nicht-Whitespace/nicht-alphanumerischen ersetzen. In vielen Fällen sollten die nicht-weißen Leerzeichen, nicht-alphanumerische Zeichen keine Bindestriche sein. Dh: "Frauennacht" wäre "Frau-Nacht". Ich würde zuerst whitespace ('/ \ s + /') durch Bindestriche ersetzen, dann ersetzen Sie alle anderen ('/ [^ a-zA-Z0-9] + /') mit einer leeren Zeichenfolge. Sie können die Trimmung auch weglassen. –

+0

Nach oben bearbeiten: Sie müssen dem zweiten Ersatz einen Gedankenstrich hinzufügen: '/ [^ a-zA-Z0-9 \ -] + /' –

17

Ich war gerade die Arbeit mit etwas ähnlichem, und ich kam mit diesem kleinen Stück Code nach oben Es berücksichtigt auch die Verwendung lateinischer Zeichen.

Dies ist die Probe string:

$str = 'El veloz murciélago hindú comía fe<!>&@#$%&!"#%&?¡?*liz cardillo y kiwi. La cigüeña ¨^;.-|°¬tocaba el saxofón detrás del palenque de paja';

Zuerst habe ich die Zeichenfolge zu htmlentities umbauen es einfacher zu machen, später zu verwenden.

$friendlyURL = htmlentities($str, ENT_COMPAT, "UTF-8", false);

Dann ersetze ich lateinische Zeichen mit den entsprechenden ASCII-Zeichen (á wird a, ÜU wird, und so weiter):

$friendlyURL = preg_replace('/&([a-z]{1,2})(?:acute|circ|lig|grave|ring|tilde|uml|cedil|caron);/i','\1',$friendlyURL);

Dann habe ich den String zurück aus html konvertieren Entitäten zu Symbolen, wiederum zur späteren leichteren Verwendung.

$friendlyURL = html_entity_decode($friendlyURL,ENT_COMPAT, "UTF-8");

Nächste ersetze ich alle nicht alphanumerischen Zeichen in Bindestriche.

$friendlyURL = preg_replace('/[^a-z0-9-]+/i', '-', $friendlyURL);

Ich entferne zusätzliche Bindestriche in der Zeichenfolge:

$friendlyURL = preg_replace('/-+/', '-', $friendlyURL);

Ich entferne vordere und hintere Bindestriche:

$friendlyURL = trim($friendlyURL, '-');

Und schließlich alles in Kleinbuchstaben umwandeln:

$friendlyURL = strtolower($friendlyURL);

Alle zusammen:

function friendlyUrl ($str = '') { 

    $friendlyURL = htmlentities($str, ENT_COMPAT, "UTF-8", false); 
    $friendlyURL = preg_replace('/&([a-z]{1,2})(?:acute|circ|lig|grave|ring|tilde|uml|cedil|caron);/i','\1',$friendlyURL); 
    $friendlyURL = html_entity_decode($friendlyURL,ENT_COMPAT, "UTF-8"); 
    $friendlyURL = preg_replace('/[^a-z0-9-]+/i', '-', $friendlyURL); 
    $friendlyURL = preg_replace('/-+/', '-', $friendlyURL); 
    $friendlyURL = trim($friendlyURL, '-'); 
    $friendlyURL = strtolower($friendlyURL); 
    return $friendlyURL; 

} 

Test:

$str = 'El veloz murciélago hindú comía fe<!>&@#$%&!"#%&-?¡?*-liz cardillo y kiwi. La cigüeña ¨^`;.-|°¬tocaba el saxofón detrás del palenque de paja'; 

echo friendlyUrl($str); 

Ergebnis:

el-veloz-murcielago-hindu-comia-fe-liz-cardillo-y-kiwi-la-ciguena-tocaba-el-saxofon-detras-del-palenque-de-paja 

Ich denke, Gumbo Antwort Ihr Problem besser passt, und es ist ein kürzerer Code, aber ich dachte, es wäre nützlich für andere.

Cheers, Adriana

+0

Perfekt !!!!!!!! – Leonardo

+0

Funktioniert perfekt! Rette mein leben! Vielen Dank! – vinigarcia87

+0

5 Jahre später funktioniert es immer noch wie ein Zauber. Einfach, einfach, ich liebe es. Danke mein Herr! – LuBre

1

Wenn Sie dies für Dateinamen in PHP verwenden, wäre die Antwort von Gumbo

sein
$str = preg_replace('/[^a-zA-Z0-9.]+/', '-', $str); 
$str = trim($str, '-'); 
$str = strtolower($str); 

Added eine Zeit für Dateinamen und es ist strtolower(), nicht strtolowercase().

6

In einer Funktion:

function sanitize_text_for_urls ($str) 
{ 
    return trim(strtolower(preg_replace(
     array('/[^a-z0-9-\s]/ui', '/\s/', '/-+/'), 
     array('', '-', '-'), 
     iconv('UTF-8', 'ASCII//TRANSLIT', $str))), '-'); 
} 

Was es tut:

// Solve accents and diacritics 
$str = iconv('UTF-8', 'ASCII//TRANSLIT', $str); 

// Leave only alphanumeric (respect existing hyphens) 
$str = preg_replace('/[^a-z0-9-\s]/ui', '', $str); 

// Turn spaces to hyphens 
$str = preg_replace('/\s+/', '-', $str); 

// Remove duplicate hyphens 
$str = preg_replace('/-+/', '-', $str); 

// Remove trailing hyphens 
$str = trim($str, '-'); 

// Turn to lowercase 
$str = strtolower($str); 

Hinweis:
Sie mehr preg_replace, indem ein Array kombinieren. Siehe die Funktion oben.

Zum Beispiel:

// Électricité, plâtrerie --> electricite-platrerie 
// St. Lücie-Pétêrès   --> st-lucie-peteres 
// -Façade- & gros œuvre  --> facade-gros-oeuvre 

// _-Thè quîck ~`[email protected]#&$%^ &*()_+= ---{}|][ :"; <>?.,/ fóx - jümpëd_- 
// the-quick-fox-jumped 

EDIT: hinzugefügt "/ u" am Ende des Regex UTF8
EDIT zu verwenden: ein Anteil von duplizierten und Vorder-/Hinter Bindestrichen dank @LuBre

+0

Ich denke, es ist die beste Lösung bisher. – barell

+0

Nice one, ich würde einfach '$ str = preg_replace ('/ - + /', '-', $ str)' hinzufügen, um alle möglichen aufeinanderfolgenden Leerzeichen zu entfernen. Beispiel: "Hallo-wie --- bist-du" wird in "Hallo-wie-bist-du" umgewandelt. – LuBre

+0

Dank @LuBre, ich habe dein Feedback aufgenommen – gabssnake