kostenloser Webspace werbefrei: lima-city


Titel zur Rewrite URL umwandeln?

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    ranks

    ranks hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    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…
  4. 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.
  5. Autor dieses Themas

    ranks

    ranks hat kostenlosen Webspace.

    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
  6. 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
  7. 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
  8. 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
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!