Michael: Wort suchen.

Hallo
ich möchte gerne mit preg_replace in einem Text nach einem oder mehreren Worten suchen und diese unterstreichen lassen. Den HTML Code fürs Unterstreichen habe ich schon gemacht, ich komme nur nicht weiter, wie ich das Wort überhaupt eingrenzen soll. Also das Wort kann überall im Text stehen, aber ich habe keine Idee wie ich das machen könnte.
Bin für jede Hilfe sehr dankbar

danke, euer Michael

  1. Hallo du da draußen,

    Solange das Wort, dass du unterstreichen möchtest, kein regulärer Ausdruck ist, wäre es mit der Funktion str_replace() (http://php.net/str_replace) geschickter.
    Wenn du deinen Text in einer Variablen $text und das Wort, dass du unterstreichen willst, in der Variable $wort hast, sähe es dann so aus:

    $html_code_davor = "<span style="text-decoration:underline;">"; // Der HTML-Code, der vor dem Wort eingefuegt werden soll
    $html_code_danach = "</span>"; // Der HTML-Code, der nach dem Wort eingefuegt werden soll
    $text = str_replace($wort, $html_code_davor.$wort.$html_code_danach, $text);

    Wenn du mehrere Wörter hast, lasse die Funktion einfach in einer Schleife mit jedem der Wörter durchführen.

    Hast du allerdings einen regulären Ausdruck, nach dem du das Wort suchen willst, das du unterstreichen lassen willst, wird es ein wenig komplizierter:

    $text = preg_replace("/".$wort."/", $html_code_davor."\0".$html_code_danach, $text);

    Jetzt wäre dann noch zu beachten, dass du diverse Zeichen, wie zum Beispiel den Slash (/) in $wort maskierst (also beispielsweise zu / machst). Diverse andere Zeichen müssen dann auch noch ersetzt werden. Außerdem besteht dann noch die Möglichkeit, die Überprüfung auf Groß-/Kleinschreibung auszuschalten, aber dazu liest du dir am besten die Anleitung der Funktion preg_match (http://php.net/preg_match) durch.

    Grüße von hier drinnen, aus Biberach an der Riss (http://www.stadt-biberach.de/),
    Candid Dauth (Dogfish)

    --
    Selten Dumme sind nicht selten, aber dumm.
    http://dogfish.net.tc/
    1. Ja, ich brauche auf jeden Fall reguläre Ausdrücke, weil die Worte zb. auch mehrere beliebige Zeichen dazwischen haben können, als so: ab.c

      Das grundlegende hab ich mal hinbekommen nur ein Problem hab ich jetzt noch: welche zeichen muss ich denn alle maskieren? Gibts da eine Funktion? Das ist ja sonst unmöglich.

      1. Hallo du da draußen,

        Das grundlegende hab ich mal hinbekommen nur ein Problem hab ich jetzt noch: welche zeichen muss ich denn alle maskieren? Gibts da eine Funktion? Das ist ja sonst unmöglich.

        Wenn du willst, dass der Benutzer selbst einen regulären Ausdruck verwenden darf, dann brauchst du garkeine Zeichen maskieren (außer dem Slash), denn das muss dann der Benutzer selbst machen. Willst du allerdings dem Benutzer verschiedene Zeichen im regulären Ausdruck verbieten (was ich nicht glaube), dann musst du eben diese Zeichen maskieren lassen.

        Wenn du zum Beispiel einen Punkt maskierst, dann steht der Punkt nicht mehr für ein beliebiges Zeichen, sondern für einen echten Punkt. Genauso mit den anderen Zeichen. Es ist also deine Entscheidung, welche Zeichen du maskieren lassen willst.

        Grüße von hier drinnen, aus Biberach an der Riss (http://www.stadt-biberach.de/),
        Candid Dauth (Dogfish)

        --
        Selten Dumme sind nicht selten, aber dumm.
        http://dogfish.net.tc/
        1. Ich will alle maskieren. Die einzige Möglichkeit, die der Benutzer hat, ist einen Joker zu setzen, und zwar den *, der soviel bedeuten soll wie der . bei den regexp.
          Ich hab das jetzt so gelöst:

          Diese Zeichen maskiere ich: array("\", "^", "$", "+", ".", "(", ")", "[", "]", """, "'", "/");

          Und der * wird danach zu dem: .\S

          ist das ok so? Der Stern soll also alle Zeichen erlauben, nur keine Leerzeichen.

          Danke für deine Mühe mit mir.

          1. Hallo.

            Und der * wird danach zu dem: .\S

            Also \S dürfte reichen, da das alle Zeichen außer Whitespace-Zeichen sind.

            MfG _Siro.

            1. Klappt aber leider nicht ganz.
              Jetzt hab ich .? probiert, das geht etwas besser, aber auch nicht so wie ich es mir vorstelle.

              Suche ich zb. *i*e bekomme ich Worte wie 'wie' und 'die' 'eine', ich will aber dass dann auch Worte wie 'zeigen' 'indien' etc. gefunden werden. Dass links und rechts ein Leerzeichen stehen müssen, habe ich so gelöst: "/ ".$word." /i"

              Ist das gut so?

              1. Hallo du da draußen,

                Suche ich zb. *i*e bekomme ich Worte wie 'wie' und 'die' 'eine', ich will aber dass dann auch Worte wie 'zeigen' 'indien' etc. gefunden werden.

                Du willst also, dass * auch für mehrere Zeichen stehen darf?
                Dann ersetze es durch .+
                Wenn du willst, dass es für mehrere oder kein Zeichen stehen darf, benutze .*
                Bei einem oder keinem Zeichen .?
                Und bei genau einem Zeichen einfach nur .

                Dass links und rechts ein Leerzeichen stehen müssen, habe ich so gelöst: "/ ".$word." /i"

                Ist das gut so?

                Wenn du wirklich willst, dass es Leerzeichen sein _müssen_, dann schon, aber es könnte ja auch kein Leerzeichen, sondern der Anfang vom Text dastehen, oder das Ende, also hätte man schon mal
                "/(^| )".$word."( |$)/i"

                Es gibt irgendein Zeichen, dass für einen Worttrenner steht, das heißt, wenn eine Klammer davor steht, oder auch der Textanfang, oder ein Leerzeichen, immer wird es genommen. Aber da es schon so spät ist, fällt es mir leider nicht ein. :-)
                Aber egal. Du willst ja, dass da Leerzeichen stehen müssen...

                Grüße von hier drinnen, aus Biberach an der Riss (http://www.stadt-biberach.de/),
                Candid Dauth (Dogfish)

                --
                Selten Dumme sind nicht selten, aber dumm.
                http://dogfish.net.tc/
                1. Hallo du da draußen,

                  Also in deinem Fall willst du * durch [^ ]* ersetzen.
                  [^ ] bedeutet ein beliebiges Zeichen, das kein Leerzeichen ist. Der Stern danach bedeutet, dass dieses Zeichen beliebig oft oder auch garnicht vorkommen muss.

                  Wie schon in SelfHTML erwähnt wird, entspricht \b der Wortgrenze.
                  Also sieht dein regulärer Ausdruck so aus:
                  "/\b".$wort."\b/i"

                  Ich hoffe, dass dir das jetzt endlich geholfen hat.

                  Und bitte lies dir die </faq/> durch.

                  Grüße von hier drinnen, aus Biberach an der Riss (http://www.stadt-biberach.de/),
                  Candid Dauth (Dogfish)

                  --
                  Selten Dumme sind nicht selten, aber dumm.
                  http://dogfish.net.tc/
              2. Tut mir leid, das war wohl nicht ganz vollständig.
                Mit \S*? funktioniert es hoffentlich.
                Das * steht für kein oder beliebig viele Zeichen.
                Der Punkt schließt übrigens Leerzeichen nicht aus.

                MfG _Siro.