Sue: Link aus Text generieren

Hallo,
habe mal eine Frage ;-)
Lese aus einer MySql Datenbank einen Text aus (aus einen Blob Feld, da der Text recht lang ist).
Nun möchte ich einzelne Teile des Textes mit einem automatisch generierten Link versehen. Ist soetwas möglich?
Habe mir vorgestellt den zu verlinkenden Text (z.B. Namen) durch Sonderzeichen zu kennzeichnen und dann bei der Abfrage bzw. Ausgabe zu sagen wenn dieses Zeichen vorkommt, ersetze es durch Link.
Sinn der Sache ist es, daß wenn jemand, der sich nicht mit HTML auskennt einen Text eingibt, er kein <a href= etc schreiben muß sondern nur diese(s) Sonderzeichen vor und nach dem zu verlinkenenden Text einfügen muß und dann wie gesagt der Link auf der Seite erscheint.
Der Link würde auf eine einheitliche Seite verweisen, nur mit dem Parameter des TExtes als suchfunktion.

Hmm, ist wohl etwas unverständlich also hier mal ein Beispiel:

Eingabe in Datenbank:
<p>TExt TExt Text Text §Billy Wilder§ TExt TExt Text Text</p>

Ausgabe auf Seite:
echo "<p>TExt TExt Text Text <a href='suche.php?name=Billy%20Wilder'>Billy Wilder</a> TExt TExt Text Text</p>";

Also müßte zum einen das Sonderzeichen durch den Linkanfang bzw. Link Ende ersetzte werden, zum anderen müßte der Text innerhalb der Sonderzeichen einmal in den Link eingebaut werden und dann nochmal als Klartext zum draufklicken stehen...

Wie kann man (bzw. ich) soetwas machen? Gibt es dafür vielleicht schon eine Fixe PHP Funktion?
Ach ja: Ist das %20 richtig wenn ich den Namen mit Leerzeichen als gesamten Parameter übergeben will?

Wäre echt lieb, wenn Ihr mir helfen könntet.

Liebe Grüße,
Sue

  1. hi,

    Habe mir vorgestellt den zu verlinkenden Text (z.B. Namen) durch Sonderzeichen zu kennzeichnen und dann bei der Abfrage bzw. Ausgabe zu sagen wenn dieses Zeichen vorkommt, ersetze es durch Link.

    Informiere dich mal über das Stichwort BBCode.

    Christian Seiler stellt zur Verarbeitung von solchem eine exzellente BBCode-Parserklasse zur Verfügung.

    Ach ja: Ist das %20 richtig wenn ich den Namen mit Leerzeichen als gesamten Parameter übergeben will?

    Für diesen Sonderfall ja, für andere Sonderzeichen braucht es natürlich aber wieder eine andere Kodierung.
    Solche Fälle brauchst du aber nicht manuell behandeln, dafür gibt es in PHP die Funktion urlencode.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Genial,
      genau danach habe ich gesucht!
      Tausend Dank!
      Grüße,
      Sue

  2. Hallo Sue,

    Habe mir vorgestellt den zu verlinkenden Text (z.B. Namen) durch Sonderzeichen zu kennzeichnen und dann bei der Abfrage bzw. Ausgabe zu sagen wenn dieses Zeichen vorkommt, ersetze es durch Link.
    ...
    Ausgabe auf Seite:
    echo "<p>TExt TExt Text Text <a href='suche.php?name=Billy%20Wilder'>Billy Wilder</a> TExt TExt Text Text</p>";

    Als Sonderzeichen wären mir jetzt doppelte eckige Klammern äußerst sympatisch. Zum Einen kommen sie in Texten äußerst selten und in URLs überhaupt nicht vor, und zum Anderen braucht man sich als MediaWiki/Wikipedia-Geschädigter nicht umzugewöhnen ...

    Das könnte dann im Rohtext so aussehen:
    <p>TExt TExt Text Text [[Billy Wilder]] TExt TExt Text Text</p>

    Wie kann man (bzw. ich) soetwas machen? Gibt es dafür vielleicht schon eine Fixe PHP Funktion?

    Es gibt mehrere -- aber mein Favorit für solche Fälle ist
    preg_replace(). Damit hat man eins-zwei-drei eine solche Quelltext-Umwandlung hingezaubert.

    Ach ja: Ist das %20 richtig wenn ich den Namen mit Leerzeichen als gesamten Parameter übergeben will?

    Im Prinzip ja, aber wenn du beliebige Texte in URLs umsetzen willst, solltest du dir mal die Funktion urlencode() anschauen. Die "entschärft" automatisch die Zeichen, die in URLs nichts zu suchen haben.

    So und jetzt mal das ganze Gesülze in Quelltextform:

    <?php  
    $text_alt = 'TExt TExt Text Text [[Fräulein Ingeborg]] TExt TExt Text Text';  
    $url_prefix = 'http://www.google.de/search?hl=de&q=';  
      
    $text_neu = preg_replace(  
      '/\[{2}([^\]]+)\]{2}/e',  
      ' \'<a href="'.$url_prefix.'\'.urlencode("$1").\'">$1</a>\''  ,  
      $text_alt  
    );  
    print($text_neu);  
    ?>
    

    MffG
    EisFuX

    --
    Auch meine Hosenträger sind intelligent, in dem Sinne, dass man sie regulieren kann. Sie besitzen ein adaptives Verhalten.
    Stanisław Lem
    1. Hi EisFux,
      auch Dir tausend Dank - echt klasse, besonders, daß Du mir gleich einen verwendbaren Quelltext dazugegeben hast!
      Im Prinzip würde mir das vollkommen genügen, da es nur um die Erstellung der Links geht und welche Sonderzeichen ich verwende ist mir ja relativ egal.
      Dumme Frage wo kommt $1 in Deinem Beispiel her?
      Grüße,
      Sue

      1. Hello out there!

        Dumme Frage wo kommt $1 in Deinem Beispiel her?

        http://de.selfhtml.org/javascript/objekte/regexp.htm#dollar_1_9@title=Daher. (In PHP ist das analog.)

        See ya up the road,
        Gunnar

        --
        “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
      2. Hi Sue,

        auch Dir tausend Dank - echt klasse, besonders, daß Du mir gleich einen verwendbaren Quelltext dazugegeben hast!

        Ja, man tut, was man kann ... ;-)

        Dumme Frage wo kommt $1 in Deinem Beispiel her?

          
        preg_replace(  
          '/\[{2}([^\]]+)\]{2}/e', // Suchmuster  
          '\'<a href="'.$url_prefix.'\'.urlencode("$1").\'">$1</a>\'', // "Ersetzen"-String  
          $text_alt  // Heuhaufen  
        )  
        
        

        Das kommt daher, weil preg_replace() mit regulären Ausdrücken arbeitet. Damit bastelt man "Suchmuster", mit deren Hilfe preg_replace() den "Heuhaufen" $text_alt durchsucht. Setzt man in diesem Suchmuster bestimmte Teile in runde Klammern, so erzeugen die preg-Befehle von PHP eine so genannte Rückreferenz (engl. "back reference"). Auf die kann man dann im "Ersetzen"-Parameter zurückgreifen. Um diese Referenzen zu unterscheiden, werden sie einfach der Reihe nach durchnummeriert. Die erste Klammer erhält also die Nummer eins. Daher das "$1".

        Und wenn du jetzt immer noch nicht genug von regulären Ausdrücken hast, kannst du ja mal hier weiterlesen:
        http://www.php-resource.de/tutorials/read/10/1/

        oder auch hier:
        http://de.wikipedia.org/wiki/Regulärer_Ausdruck

        oder hier:
        http://pcre.nophia.de/intro/index.php

        oder auf Englisch hier:
        http://www.tote-taste.de/X-Project/regex/

        MffG
        EisFuX

        --
        Auch meine Hosenträger sind intelligent, in dem Sinne, dass man sie regulieren kann. Sie besitzen ein adaptives Verhalten.
        Stanisław Lem