Suchwort wie bei Google (Archiv) markieren (nicht aus String auslesen)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Suchwort wie bei Google (Archiv) markieren (nicht aus String auslesen)

    Hallo,

    ich würde gerne ein beliebiges Suchwort (z.B. "Body") auf einer PHP Seite farbig markieren. Also oben eine kleine Form, dann Suchwort eingeben, auf Button klicken und das gefundene Wort wird auf dieser Seite farbig markiert.

    Problem:

    1) Nur die Ausgaben auf dem Bildschirm sollen natürlich durchsucht werden, keine PHP / HTML Anweisungen wie z.B. das Body in <Body>

    2) Der Text befindet sich NICHT in einer Variable, sondern z.B. in so einer Seite:

    <HTML>
    <Body>
    <p> Was für ein Body</p>
    </Body>
    </HTML>


    Also dürfte zwar über dem HTML Beginn eine PHP Funktion stecken, die das Suchwort markiert. Der zu durchsuchende Text ist aber rein HTML formatiert. -->

    <? Funktion markiere Suchwort "Body" ?>
    <HTML>
    <Body>
    <p> Was für ein Body</p>
    </Body>
    </HTML>


    So ähnlich muss das wohl auch Google machen, oder aber sie stecken die Archivseite komplett in einen String... oder... oder ...

    Bin etwas verzweifelt, suche schon lange und dachte das es so ein Script schon längst geben müsste.

    P.S. Auf die Gefahr, dass ich mich wiederhole. Mir ist klar, dass ich eine Variable nach einem Wort durchsuchen kann und dieses Wort dann mit Dingsbums_replace ersetzen / erweitern kann
    , aber dazu müsste ich den zu durchsuchenden Text ja irgendwie in die Variable bekommen, verändern und dann erst ausgeben.

    Grüße,

    123Dabei

  • #2
    die ob_* funktionen zum output buffering helfen dir, die ausgabe an den client abzufangen und mit preg_* (also, regulären ausdrücken) richtig auszuwerten.

    Kommentar


    • #3
      Original geschrieben von penizillin
      die ob_* funktionen zum output buffering helfen dir, die ausgabe an den client abzufangen und mit preg_* (also, regulären ausdrücken) richtig auszuwerten.
      Hi,

      ich habe mir diese ob_ Funktionen angeschaut und es so verstanden, dass ich nur Ausgaben des Scripts selbst, dabei verwerten kann. Also z.B.:

      ob_start()

      print "<html><p>blabla</p> ..."



      Dazu müsste ich aber die HTML Angaben zuerst in das PHP Script schaffen, oder? Zumindest habe ich es so verstanden, bin Anfänger und etwas verwirrt was diese Puffer Funktionen betrifft.

      Grüße,

      123Dabei

      Kommentar


      • #4
        ...zuerst in das PHP Script schaffen...
        ?

        wenn es doch eine php datei ist, dann findet eine ausgabe statt, wenn der browser die antwort bekommt.

        d.h. für dich - am ende deines scriptes ob_get_contents() verwenden, um die ausgabe in eine variable abzufangen.

        danach mit preg_* bearbeiten und wieder ausgeben.

        Kommentar


        • #5
          Original geschrieben von penizillin
          ?

          wenn es doch eine php datei ist, dann findet eine ausgabe statt, wenn der browser die antwort bekommt.

          d.h. für dich - am ende deines scriptes ob_get_contents() verwenden, um die ausgabe in eine variable abzufangen.

          danach mit preg_* bearbeiten und wieder ausgeben.
          Was aber immernoch nicht das Problem mit den Tags löst.
          Bei der Suche nach body würde <body> und Dies ist ein body hervorgehoben. Ersteres würde die gesamte Layoutstruktur zerstören.

          mit preg_* (also, regulären ausdrücken) richtig auszuwerten.
          Das hieße aber, dass man alle HTML-Tags auf ihre Korrektheit überprüfen müsste, sodass diese nicht in die Hervorhebung miteinbezogen werden, was aber gewisse Standards bei der Texteingabe vorraussetzt.
          Zuletzt geändert von Indigo; 04.02.2005, 19:32.

          Kommentar


          • #6
            Original geschrieben von Indigo
            Das hieße aber, dass man alle HTML-Tags auf ihre Korrektheit überprüfen müsste, sodass diese nicht in die Hervorhebung miteinbezogen werden, was aber gewisse Standards bei der Texteingabe vorraussetzt. [/B]
            ich meine, nicht.

            Kommentar


            • #7
              Hi,

              Habe das Script verändert, indem ich ein Echo eingefügt habe UND vorher den Puffer wieder gesäubert habe (sonst erscheint ja der Text doppelt (HTML-Ausgabe und String-Ausgabe) Jetzt klappt es!!! Damit habe ich mein erstes sinnvolles Programm geschrieben. Gehet hin und nutzt es! *lol


              PHP-Code:
              <? ob_start(); ?>
              <html>
              <head>
              <title>Test</title>
              <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
              </head>
              <body>
              <p>Nur ein Body Test </p>
              </body>
              </html>
              <?
              $wort="Body"; 
              $text=ob_get_contents();
              $text = str_replace($wort, "<font color=\"red\"><b>".$wort."</b></font>", $text);
              echo $text;
              ob_end_flush();
              ?>


              Grüße,

              123Dabei

              Kommentar


              • #8
                Zusatz:

                Beim ersetzen verwende ich wohl besser das hier bereits angesprochene preg_replace

                $text=preg_replace("/((<[^>]*)|$wort)/ie", '"\2"=="\1"? "\1":"<span style=\"background-color:yellow;\"><b>\1</b></span>"', $text);


                Grüße und Dank im Voraus,

                123Dabei
                Zuletzt geändert von 123Dabei; 05.02.2005, 10:45.

                Kommentar


                • #9
                  Ich bin schon die ganze Zeit am überlegen, wie man recht elegant ein Suchwort, welches bereits im eigentlichen Quelltext verschiedene Formatieruungstags enthält, hervorheben kann.

                  Suchwort:
                  Smilie

                  Quelltext:
                  Code:
                  Ich bin ein Smi<i>li</i>e.
                  Als Ergebnis soll an Hand obiger Lösung folgendes ausgegeben werden:
                  Code:
                  Ich bin ein <span style="background-color:yellow;">Smi<i>li</i>e</span>.
                  Sprich: Dar reguläre Ausdruck muss irgendwie kurzzeitig die im String einthaltenen HTML-Tags ausser Acht lassen, um dennoch das Suchwort zu erkennen.

                  Zuletzt geändert von Indigo; 06.02.2005, 01:47.

                  Kommentar


                  • #10
                    da würde ich vielleicht vorher erst mal strip_tags über den zu durchsuchenden ausdruck drüberbügeln, um "Smilie" überhaupt erst mal auffinden zu können ...
                    I don't believe in rebirth. Actually, I never did in my whole lives.

                    Kommentar


                    • #11
                      Hi und grrr,

                      jetzt dachte ich die blödesten Hürden wären umschifft, da tauchten neue auf:

                      ein Suchwort, dass per Link (Get) übergeben schafft Probleme mit den Umlauten:


                      LÖSUNG:

                      in der zu durchsuchenden Seite wird folgendes in dem obigen Code eingefügt (Wort ist das zu suchende Wort)

                      PHP-Code:

                      // sonderzeichen in der url umwandeln

                      $wort str_replace("ä""&auml;"$wort);
                      $wort str_replace("Ä""&Auml;"$wort);
                      $wort str_replace("ö""&ouml;"$wort);
                      $wort str_replace("Ö""&Ouml;"$wort);
                      $wort str_replace("ü""&uuml;"$wort);
                      $wort str_replace("Ü""&Uuml;"$wort);
                      $wort str_replace("ß""&szlig;"$wort);
                      // Ende Sonderzeichen umwandeln 
                      Geht bestimmt auch mit einem Array aber ich bin zu hungrig um das auch noch herauszufinden, also wenn da Jemand anders so freundlich wäre?

                      ------


                      Nochmal zu dem Smilie Problem, wenn ich Strip_tags benutze nur um es zu finden, müsste es ja eine Funktion geben die sich dies Formatierung merkt und dann wieder anwendet nachdem es gefunden wurde nebst neuer Formatierung als Markierung...


                      Kommentar


                      • #12
                        urldecode() und htmlentities() könnten dir bei den umlauten helfen.

                        Kommentar


                        • #13
                          Von
                          Original geschrieben von penizillin
                          urldecode()
                          sollte man in Verbindung mit $_GET - Variablen dringendst abraten, zumal die letzten Defacements diverser PHPBB-Boards genau auf einem Fehler in dieser Funktion aufbauten.

                          zu meinem Problem:
                          Auf recht unpragmatische Weise habe ich es lösen können, vielleicht nicht soo elegant wie erhofft, aber zumindest erfüllt es seinen Zweck:

                          PHP-Code:
                          <?php
                           $wort 
                          "Smilie";

                           
                          $text '<html>
                          <head>
                          <title>Test</title>
                          <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
                          </head>
                          <body>
                          <p>Ich bin ein Smi<span style="font-weight:bold;">li</span>e</p>
                          </body>
                          </html>'
                          ;

                           for(
                          $i 0$i strlen($wort); $i++) {
                                  
                          $suchmuster .= $wort[$i] . "((\<(.*)\>)?)";
                           }

                           
                          $text preg_replace("/((<[^>]*)|$suchmuster)/ie",
                                              
                          '"\2"=="\1"? "\1":"<span style=\"background-color:yellow;\"><b>\1</b></span>"'$text);
                           echo 
                          $text;
                          ?>

                          Kommentar


                          • #14


                            Hi,

                            irgendwas klappt da bei mir nicht, wenn ich Dein Script ausprobiere.
                            Die Anzeige wir durch 1er, spitze Klammern und gelbe Blöcke verwirrt.
                            Im Sourcecode steht folgendes:

                            PHP-Code:
                            <html><head></head>
                            <
                            body><span style="background-color: yellow;"><b>1</b></span>&gt;
                            <
                            span style="background-color: yellow;"><b>1</b></span>&gt;
                            <
                            span style="background-color: yellow;"><b>1</b></span>&gt;
                            Test<span style="background-color: yellow;"><b>1</b></span>&gt;
                            <
                            span style="background-color: yellow;"><b>1</b></span>&gt;
                            <
                            span style="background-color: yellow;"><b>1</b></span>&gt;
                            <
                            span style="background-color: yellow;"><b>1</b></span>&gt;
                            <
                            span style="background-color: yellow;"><b>1</b></span>&gt;
                            Ich bin ein Smi<span style="background-color: yellow;"><b>1</b></span>&gt;
                            li<span style="background-color: yellow;"><b>1</b></span>&gt;
                            e<span style="background-color: yellow;"><b>1</b></span>&gt;

                            <
                            span style="background-color: yellow;"><b>1</b></span>&gt;
                            <
                            span style="background-color: yellow;"><b>1</b></span>&gt;
                            </
                            body></html

                            Kommentar


                            • #15
                              Hi,

                              ich habe noch mal zusammengefasst. Das Umlaut-/Sonderzeichenproblem wurde durch die htmlentities() entscheident verkleinert *g

                              Leider bleibt das, wenn auch wohl ungewöhnliche Problem, dass formatierte Suchwörter wie z.B. Lorem (siehe unten) bzw. das Smiliewort nicht gefunden werden können.

                              Beim Einsatz des Codes von Indigo (hier jetzt nicht eingesetzt) klappt es leider auch nicht, aber vielleicht mache ich auch etwas falsch, oder?

                              PHP-Code:
                              <? ob_start(); ?>

                              <html>
                              <head>
                              <title>Test</title>
                              <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
                              </head>

                              <body>

                              <p>gr&ouml;&szlig;er <strong>Lo</strong>rem ipsum dolor 
                                sit amet...</p>

                              </body>
                              </html>

                              <?
                              $wort=$_GET["wort"];

                              // sonderzeichen umwandeln
                              $wort=htmlentities($wort);
                              // Ende Sonderzeichen umwandeln

                              $text=ob_get_contents();
                              ob_end_clean();

                              //Wort markieren
                              $text=preg_replace("/((<[^>]*)|$wort)/ie", '"\2"=="\1"? "\1":"<span style=\"background-color:yellow;\"><b>\1</b></span>"', $text);
                              //Ende Wort markieren

                              echo $text;
                              ob_end_flush();
                              ?>

                              Kommentar

                              Lädt...
                              X