Bastelstunde: Schöne URLs
Durch Zufall bin ich heute auf einen Thread in meinem Forum gestoßen. Dieser Thread hat mich direkt dazu gebracht, eine Funktion zu erstellen, die aus Thread-Titel (oder ähnlichem) URL-taugliche Strings macht. Sie ist wahrscheinlich nicht 100%ig komplett und entspricht auch nicht Jedermans Geschmack, aber ich wollte sie trotzdem mal veröffentlichen. In Aktion kann man das Script hier bewundern.
Funktion zum Erstellen von URLs aus Thread-Titeln
-
function make_urlname($name)
-
{
-
/* Schritt 1: Kleinbuchstaben */
-
$name = strtolower($name);
-
-
/* Schritt 2: Ausgewählte Zeichen ersetzen */
-
$name = str_replace(" ", "-", $name);
-
$name = str_replace("ß", "ss", $name);
-
$name = str_replace("ä", "ae", $name);
-
$name = str_replace("ö", "oe", $name);
-
$name = str_replace("ü", "ue", $name);
-
-
/* Schritt 3: Alles andere entfernen */
-
$whitelist = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
-
'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
-
'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '+');
-
$name_tmp = "";
-
for ($i=0; $i<strlen($name); $i++) {
-
$char = substr($name, $i, 1);
-
if (in_array($char, $whitelist)) {
-
$name_tmp .= $char;
-
}
-
}
-
-
/* Schritt 4: Doppelte Leerzeichen entfernen */
-
$count = -1;
-
while ($count != 0) {
-
/* Irgendwie macht WP hier nur ein Minus draus, daher so… */
-
$name_tmp = str_replace('-' . '-', '-', $name_tmp, $count);
-
}
-
-
/* Schritt 5: Leerzeichen (d.h. '-') am Anfang und am Ende entfernen */
-
return trim($name_tmp, '-');
-
}
Update: Für eine Übersetzung in die Programmiersprache Python bitte auf mehr klicken.
Python-Übersetzung
-
def make_urlname(name):
-
# Schritt 1: Kleinbuchstaben
-
name = name.lower()
-
-
# Schritt 2: Ausgewählte Zeichen ersetzen
-
replaces = {
-
u' ': u'-',
-
u'ß': u'ss',
-
u'ä': u'ae',
-
u'ö': u'oe',
-
u'ü': u'ue',
-
}
-
for search, replace in replaces.iteritems():
-
name = name.replace(search, replace)
-
-
# Schritt 3: Alles andere entfernen
-
whitelist = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
-
'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
-
'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '+')
-
new_name = ''
-
for char in name:
-
if whitelist.count(char) > 0:
-
new_name += char
-
-
# Schritt 4: Doppelte Leerzeichen entfernen
-
while new_name.count('–') > 0:
-
new_name = new_name.replace('–', '-')
-
-
# Schritt 5: Leerzeichen (d.h. '-') am Anfang und am Ende entfernen
-
return new_name.strip('-')
function create_seo_url($data){
$search = array (‘ä’, ‘ö’, ‘ü’, ‘Ä’, ‘Ö’, ‘Ü’, ‘ß’, ‘&’);
$replace = array (‘ae’, ‘oe’, ‘ue’, ‘Ae’, ‘Oe’, ‘Ue’, ‘ss’, ‘und’);
$str = str_replace($search, $replace, $data); // Tauscht Umlaute und Sonderzeichen aus
$str = strtolower($str); // wandelt alles zu Kleinbuchstaben um
$url=str_replace(‘ ‘, ‘-’,preg_replace(“/[^a-zA-Z0-9 ]/”,”",$str)); //sonderzeichen entfernen
return $url;
}
Die Code-Optimierung über die Search-And-Replace Arrays ist eine gute Idee, evtl. baue ich das auch noch ein. Etwas unnötig ist die Tatsache, dass du große und kleine Umlaute ersetzt. Wenn du erst strtolower benutzt, dann sparst du dir das. Auf Reguläre Ausdrücke habe ich zu gunsten der Performance verzichtet. Wenn ich Lust und Zeit habe, kann ich ja mal ein Benchmark dazu machen.
Wenn du die Performance optimieren willst, dann aber richtig d.h. mit nur einem Schleifendurchlauf. Ansonsten würde ich eher die Lesbarkeit optimieren. Gut, man kann jetzt argumentieren, dass RegEx auch nicht besonders lesbar ist, aber das kommt auf das RegEx-Wissen an. Und in dem Fall ist das ja noch sehr einfach…
Mein Favorit wäre also die RegEx-Methode (mit getauschter Reihenfolge).
mfg
Christian
Was genau meinst du mit “d.h. mit nur einem Schleifendurchlauf. “? Welche Schleife wird denn zu oft ausgeführt? Die Schleife zum Beseitigen doppelter Leerzeichen wird immer nur ein mal “zu viel” ausgeführt. Und dieses eine Mal ist sowieso notwendig, da man ja prüfen muss, ob noch doppelte Leerzeichen da sind.
Meinen Code optimiere ich vorzüglich Richtung Lesbarkeit, dass ist auch Empfehlung von Zend. Ich bin der Meinung, dass der Code relativ gut lesbar ist. Monster wie Reguläre Ausdrücke versuche ich dennoch zu vermeiden, da diese schon sehr starke Performance-Einbußen zu verzeichnen haben. Weiterhin bin ich auch der Meinung, dass diese nicht wirklich gut lesbar sind. Mein Ersatz-Code für die RegEx ist logisch aufgebaut und verwendet sprechende Bezeichner. Mit dem zugehörigen Kommentar sollte sofort alles klar sein.
Ich finds doof, wenn ich alle großen in kleine Buchstaben umwandele bevor ich mich um die Umlaute kümmere. Bei manchen Servern macht strtolower Probleme und zerschießt dann die Umlaute. Hab es jetzt zwar trotzdem vorher gemacht, nutze dafür aber mb_strtolower.
Ups, hier noch der Code:
ok, jetzt ohne PHP Zeichen:
function create_seo_url($url) {
/* Schritt 1: Kleinbuchstaben */
$url = mb_strtolower($url,”UTF-8″);
/* Schritt 2: Ausgewählte Zeichen ersetzen */
$search = array (‘ä’, ‘ö’, ‘ü’, ‘ß’, ‘&’);
$replace = array (‘ae’, ‘oe’, ‘ue’, ‘ss’, ‘und’);
$url = str_replace($search, $replace, $url);
/* Schritt 3: Alles andere entfernen */
$url = str_replace(‘ ‘, ‘-’, preg_replace(“/[^a-z0-9 ]/”, “”, $url));
/* Schritt 4: Leerzeichen (d.h. ‘-’) am Anfang und am Ende entfernen sowie String ausgeben*/
return trim($url, ‘-’);
}
Ich würde “und” sowie “&” durch ein ” ” ersetzen. Grund: Suchmaschinen erstellen auch für URLs eine Keyword-Density (“und” ist ein Stop-Word).
Hallo Andreas! Du meinst wir sollten “und” durch ein Leerzeichen ersetzen? Das ist aber gar nicht schön. Leerzeichen in URLs sehen nicht schön aus und geben teilweise bei Messengern oder Konsolen-Programmen Probleme, wenn deren Leerzeichen nicht escaped wurden. Ein einfaches “und” steigert meiner Meinung nach die Lesbarkeit einer URL enorm. Da es sich dabei ja um ein Stopp-Wort handelt, dürfte es Google doch eigentlich kaum stören?
Hallo Valle,
ich meinte einen Bindestrich (den hat dein WordPress leider entfernt).
Groß,
Andreas