Titel zur Rewrite URL umwandeln?
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfragen
array
beispiel
code
datei
entfernen
euro
funktion
http
inhalt
machen
manual
problem
reflektieren
regeln
sonderzeichen
string
umlaut
url
zeichen
-
Hallo
ich möchte Seiten-Titel so umschreiben,
damit ich diese für Rewrite (.html) URLs verwenden kann.
Beispiel:
$page_title = 'Viele Bücher Lesen macht schlau";
$page_id = 1234;
bisher rufe ich die Seite auf mit /seite.php?id=1234
je nach $_GET['id'] wird dann der Inhalt aud einer Datei geladen (include)
für die IDs habe ich eine Datei (csv) mit den Feldern: "id" und "title" (und weitere)
was muss ich machen,
damit ich die Seite so aufrufen kann: /viele-buecher-lesen-macht-schlau.html
... wie bekomme ich die Adresse (den Titel) so umgeschrieben ?
EDIT .. glaube das Problem ist auch Umlaute weil Titel in UTF-8
Beitrag zuletzt geändert: 10.10.2013 14:47:16 von ranks -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Da du das in einer CSV hast musst du eine art »Proxy-Script« machen: das wird immer aufgerufen und entscheidet dann anhand der URL und der CSV-Datei welcher Inhalt tatsächlich angezeigt werden soll.
Alternative: du generierst aus deiner CSV-Datei entsprechende Rewrite-Regeln und schreibst diese in eine .htaccess-Datei… -
Hast du eine andere Möglichkeit als eine CSV-Datei?
Das ist schon sehr unkonventionell.
Wie hackyourlife schon geschrieben hat, wäre eine .htaccess da schon sinnvoller.
Als Beispiel:
RewriteEngine on RewriteRule ^viele-buecher-lesen-macht-schlau.html seite.php?id=1234 RewriteRule ^reflektieren-macht-schlau.html seite.php?id=5678
So kannst du deine Liste erweitern und die aufgerufene URL wird an die hinten stehende Adresse weitergeleitet ohne das der Besucher davon etwas mitbekommt, da die URL im Browser stehen bleibt.
Alternativen:
- Alle Links in einer Datenbank abspeichern und diese abfragen.
- Alle Links in ein Array speichern und abfragen:
$urlRewrite = array( 'viele-buecher-lesen-macht-schlau.html' => 1234, 'reflektieren-macht-schlau.html' => 5678, );
Dieses Array kann dann auch für die Erstellung der Navigation hinhalten, indem man es vielleicht noch erweitert mit Linkname, CSS usw. -
Hallo
jetzt habe ich eine Funktion, die mir Titel in für URL brauchbaren String umwandelt.
mein "Trick" ist es, den Titel zuerst mit utf8_decode() umwandeln,
damit ich dann die Umlaute (äöüß) aus dem String ersetzen kann,
und am Ende wieder mit utf8_encode() für Rückgabe als utf-8 String
// --------------------------------------------- function clean_title($string, $spacer='-') { $string = strtolower($string); $string = utf8_decode($string); $umlx = 'äöüß'; $string = preg_replace("/[^0-9a-z".$umlx."-]/s", $spacer, $string); $string = preg_replace("/\$spacer{2,}/", $spacer, $string); $string = trim($string, $spacer); $umlz = array( 'ä', 'ö', 'ü', 'ß' ); $rplz = array( 'ae', 'oe', 'ue', 'ss' ); $string = str_replace($umlz,$rplz,$string); $string = utf8_encode($string); return $string; } // ---------------------------------------------
als Rewrite nehme ich dann doch etwas "allgemeines"
was für alle möglichen Titel funktioniert
RewriteEngine on RewriteBase / RewriteCond %{REQUEST_URI} (.*)$ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*).html /seite.php?title=$1 [QSA,L]
auf der seite.php mache ich dann eine Abfrage aus der CSV Datei
um zum Titel die ID zu finden
$id = 1; foreach($csvdata as $key => $val { if ($_GET['title'] == $val) { $id = $key; break; } }
Dann kann ich den Inhalt zu der gefundenen $id ausgeben.
(für id=1 dann die Startseite)
Problem ist, dass manche Zeichen wie € (Euro-Zeichen)
mit utf8_decode() ... utf_encode() ... nicht richtig funktionieren
... es gibt bestimmt noch mehr so Sonderzeichen, wo das nicht sauber funktioniert ?!
Wie kann ich es machen, dass auch solche wie das € Zeichen ersetzt werden
also von '€' zu 'euro' .... etc.
Beitrag zuletzt geändert: 12.10.2013 11:06:04 von ranks -
Hallo
du muss nichtmal den String utf8_decode() machen um Umlaute zu filtern,
mach einfach direkt im Pattern mit Modifier /u (für utf-8)
und nur die die Umlaute selber als utf-8 machen ... $umlx = utf8_encode('äöüß');
... $umlx = utf8_encode('äöüß'); $string = preg_replace("/[^0-9a-z".$umlx."-]/us", $spacer, $string); ...
ohne das $string = utf8_decode($string); und ohne $string = utf8_encode($string);
// --------------------------------------------- function clean_title($string, $spacer='-') { $string = strtolower($string); $string = utf8_decode($string); $umlx = utf8_encode('äöüß'); $string = preg_replace("/[^0-9a-z".$umlx."-]/us", $spacer, $string); $string = preg_replace("/\$spacer{2,}/", $spacer, $string); $string = trim($string, $spacer); $umlz = array( utf8_encode('ä'), utf8_encode('ö'), utf8_encode('ü'), utf8_encode('ß') ); $rplz = array( 'ae', 'oe', 'ue', 'ss' ); $string = str_replace($umlz,$rplz,$string); return $string; } // ---------------------------------------------
und darauf achten, dass der String auch als utf-8 an die Funktion übergeben wird
... zum Beispiel mit mb-detect-encoding prüfen
if (mb_detect_encoding($str, 'UTF-8', true) === false) { $str = utf8_encode($str); } $clean = clean_title($str);
ob das auch mit € (EURO-Zeichen) funktioniert kannn ich nicht sagen.
EDIIT .. PS: ..... das hier
$umlz = array( utf8_encode('ä'), utf8_encode('ö'), utf8_encode('ü'), utf8_encode('ß') );
kann man sicher auch noch "schöner" machen ...
Beitrag zuletzt geändert: 13.10.2013 10:49:03 von prosuche -
Die Variante von prosuche gefällt mir, denn da bleiben die umlaute erhalten.
Ich selbst verwende eine recht einfache Methode, in der nurr A-Z (klein und Gross) sowie Zahlen zugelassen sind, alles kleingeschirben und Leerzeichen am anfang und enfde entfernt werden:
strtolower(trim(preg_replace('/[^a-zA-Z0-9]+/', '-', $val), '-'));
Beitrag zuletzt geändert: 13.10.2013 14:29:26 von all-web -
Hallo
aus diesem oben hier habe ich jetzt eine Funktion gemacht title_to_slug()
zum Umschreiben von einem Artikel-Titel zu einem Slug (Name für Rewrite-URL)
// ---------------------------------------------------------------------- function title_to_slug ($string, $spacer='-', $lower=TRUE, $umlaute=FALSE) { // ------ Gross-/Klein- Schreibung ------ if (FALSE !== $lower) { $string = strtolower($string); } // ------ String in UTF-8 ------ if (mb_detect_encoding($string, 'UTF-8', true) === false) { $string = utf8_encode($string); } // ------ Umlaute in UTF-8 ------ $umlx = utf8_encode('äöüÄÖÜß'); // ------ Sonderzeichen entfernen ------ $string = preg_replace("/[^0-9a-z".$umlx."]/ius", $spacer, $string); // ------ Doppelte / mehrfache Spacer entfernen ------ $string = trim(preg_replace("/\$spacer{2,}/", $spacer, $string)); $string = trim($string, $spacer); // ------ Umlaute in zwei Buchstaben umschreiben ------ if (FALSE !== $umlaute) { $umlz = array( utf8_encode('ä'), utf8_encode('ö'), utf8_encode('ü'), utf8_encode('Ä'), utf8_encode('Ö'), utf8_encode('Ü'), utf8_encode('ß') ); $rplz = array( 'ae', 'oe', 'ue', 'AE', 'OE', 'UE', 'ss' ); $string = str_replace($umlz,$rplz,$string); } // ------------------------ return $string; } // ----------------------------------------------------------------------
was noch fehlt ist die maximale Länge von dem, was raus kommt ...
... im Ergebnis die Anzahl der Zeichen begrenzen / zuschneiden
Dazu evtl. noch ein Argument / Parameter im Funktionsaufruf $maxlength
und entsprechend den String zu-schneiden ... aufpassen beii UTF-8 ... mb_
dabei ist die Frage, ob den Titel im Wort abschneiden oder nicht ?!
oder kenn jemand andere / bessere "Title to Slug" PHP Funktion
damit man aus einer Überschrift eine Rewrite-URL machen kann ?!
danke.
Beitrag zuletzt geändert: 5.3.2016 12:00:09 von themen -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage