Stephan: Sezial - Regexp

Hallo,

ich hab eine Funktion gebastelt die in einem Text bestimmte Wörter automatisch zu Links macht. Das funktioniert auch schon, allerdings nicht so ganz wie ich es mir vorstelle, vielleicht läuft hier ja grad ein regexp Guru vorbei und kann mir ein wenig helfen:

$text = 'Hallo das
ist die Test Seite.
Der Inhalt der Test Seite ist hallo!';

$internal_links_title[1] = '#\b(' . preg_quote('Hallo') . ')\b#i';
$internal_links_href[1]  = '<a href="hallo.html">$1</a>';
$internal_links_title[2] = '#\b(' . preg_quote('test seite') . ')\b#i';
$internal_links_href[2]  = '<a href="test-seite.html">$1</a>';

preg_replace($internal_links_title, $internal_links_href, $text, 2);

Folgende Probleme tun sich auf und ich weiss nicht wie ich sie lösen kann:

1. Ersetzt wird nur der erste regexp(Hallo) der zweite(Test seite) wird nicht ersetzt, liegt vermutlich daran dass er aus zwei wörtern besteht. Also müsste man den regexp dahin bringen dass er auch mit wortphrasen umgehen kann aber trotzdem auf ganze wörter schaut (nicht dass er dann ein auch teile von wörtern ersetzt bswp. aus kofferraumdeckel das raum zum link macht)

2. Das zweite Problem ist dass wenn das erste Hallo ersetzt ist dann beim zweiten durchlauf das hallo von href="hallo.html"> auch ersetzt wird. Also müsste man den regexp dazu bringen dass er innerhalb von geöffneten tags nicht ersetzt.

Wenn mit jemand nen Tipp geben könnte ich bin schon am verzweifeln ;-(

Gruß
Stephan

  1. Huhu Stephan

    1. Ersetzt wird nur der erste regexp(Hallo) der zweite(Test seite) wird nicht ersetzt, liegt vermutlich daran dass er aus zwei wörtern besteht.

    Nö, denn "test seite" != "Test seite"

    1. Das zweite Problem ist dass wenn das erste Hallo ersetzt ist dann beim zweiten durchlauf das hallo von href="hallo.html"> auch ersetzt wird. Also müsste man den regexp dazu bringen dass er innerhalb von geöffneten tags nicht ersetzt.

    Ja, das ist das knifflige daran.

    Wenn mit jemand nen Tipp geben könnte ich bin schon am verzweifeln ;-(

    Ein Beispiel, welches allerdings nur einzelne Wörter, also keine Phrasen verlinkt findest Du z.B. dort.

    http://simplecontent.net/snippets/view/project/PHP_Snippets/03_Beispiele/01_text/link_words_2.html

    Viele Grüße

    lulu

    --
    bythewaythewebsuxgoofflineandenjoytheday
    1. Huhu,

      der Link ist schon mal nicht schlecht! Danke!

      Nö, denn "test seite" != "Test seite"

      Aber das abschließende i bei den regexps sollte es doch inkeysensitiv machen. Oder?

      Gruß
      Stephan

      1. Huhu

        Aber das abschließende i bei den regexps sollte es doch inkeysensitiv machen. Oder?

        Da "haste" wahr.

        Da habe ich also nicht ordentlich geguckt.

        Mmmh, Dein Beispiel funktioniert aber, zumindest in meiner Testumgebung.
        Die "Test Seite" wird verlinkt.
        Hast Du vielleicht nur die Zuweisung vergessen?

        Also

        $neu = preg_replace($RegExp, $Snipp, $old);

        Viele Grüße

        lulu

        --
        bythewaythewebsuxgoofflineandenjoytheday
        1. Mmmh, Dein Beispiel funktioniert aber, zumindest in meiner Testumgebung.
          Die "Test Seite" wird verlinkt.
          Hast Du vielleicht nur die Zuweisung vergessen?

          Da "haste" du jetzt wahr.

          Jetzt gehts bei mir auch, ich könnt schwören vorher hats nicht geklappt! Ich werd nochmal wahnsinnig.

          Jetzt bräucht ich nur noch die Ecke mit dem "nicht inner halb von geöffneten Tags rumfummeln" hinbekommen...

          Gruß
          Stephan

          1. ...

            für alle die es interessiert:

            So scheints wohl zu klappen:

            $internal_links_title[1] = '#\b(' . preg_quote('Hallo') . ')\b(?![^<]+>)#i';
            $internal_links_href[1]  = '<a href="hallo.html">$1</a>';
            $internal_links_title[2] = '#\b(' . preg_quote('test') . ')\b(?![^<]+>)#i';
            $internal_links_href[2]  = '<a href="test.html">$1</a>';
            $internal_links_title[3] = '#\b(' . preg_quote('test seite') . ')\b(?![^<]+>)#i';
            $internal_links_href[3]  = '<a href="test-seite.html">$1</a>';

            Aber fragt mich nicht warum ... ;-)