[REGEX]preg_replace modifier & Code Ausführung

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

  • [REGEX]preg_replace modifier & Code Ausführung

    Hallo zusammen,
    ich habe einen String der HTML und PHP Code enthält, dieser wird durchsucht, für eine Suchmaschine ohne Index.
    Bisher ersetze ich via preg_replace darin vorkommenden PHP Code wie z.B.
    PHP-Code:
    <?
    include("news.php");
    ?>
    da dieser in Suchergebnissen unerwünscht wäre und somit ausgeschlossen wird.
    Nun ist mir aber aufgefallen, dass der inkludierte HTML Output den news.php ausgibt, sehr wichtig für die Suchergebnisse meiner kleinen Suchmaschine wären.
    Meine Frage ist, ob es möglich ist, via preg_replace gefundenen PHP Code meines Suchmusters (also Code der innerhalb <? ?> steht) vor der Ersetzung auszuführen?
    Bisher habe ich immer nur PHP Funktionen wie strtoupper oder ähnliches in Verwendung mit dem e Modifier gefunden.
    Weitere Frage: wie sieht die Performance Beeinträchtigung bei solche Vorgehensweise aus?
    Vielen Dank für Tipps,
    Teco
    Zuletzt geändert von teco2008; 04.03.2010, 11:10.

  • #2
    Zum Eintausendsten mal: Wir haben hier Regeln, die müssen gelesen werden. Und wenn man das getan hat, dann weiß man, dass man Code-Tags zu benutzen hat!

    Und was du genau machen willst habe ich auch nicht kapiert.
    [FONT="Helvetica"]twitter.com/unset[/FONT]

    Shitstorm Podcast – Wöchentliches Auskotzen

    Kommentar


    • #3
      Ich habe zwar verstanden was dein Ziel ist, halte diesen Ansatz aber für eine schlechte Idee. Mal angenommen jemand sucht nach "und OR ein". Die Trefferliste dürfte so ziemlich jede Seite mit deutschem Text umfassen, also quasi deine komplette Site.
      Um die Trefferliste anzuzeigen, willst du nun jeden Treffer (=Seite) ausführen? Das heißt du willst, um eine einzige Seite aufzubauen, alle Seiten einmal ausführen!?
      Dann kannst du den Suchen-Button gleich mit "DOS this site" beschriften.

      Übrigens wäre die Lösung recht einfach: Statt die Dateien von der Platte zu öffnen, müsstest du sie nur via HTTP laden. Dann wäre sie bereits ausgeführt. Aber wie gesagt, das ist Harakiri.
      Bau lieber ein Google-Search Widget in deine Seite ein.
      Zuletzt geändert von onemorenerd; 04.03.2010, 11:21.

      Kommentar


      • #4
        Zitat von unset Beitrag anzeigen
        Zum Eintausendsten mal: Wir haben hier Regeln, die müssen gelesen werden. Und wenn man das getan hat, dann weiß man, dass man Code-Tags zu benutzen hat!

        Und was du genau machen willst habe ich auch nicht kapiert.
        Hallo unset, tut mir Leid, den include Befehl hatte ich einfach so von Hand schnell reingeschrieben.
        Um es deutlicher zu machen: ist es via preg_replace und modifier e "on the fly" möglich beliebigen Code eines Strings auf den ein Suchmuster angewandt wird, auszuführen und den String damit zu "erweitern" bzw. "modifizieren" (Inhalt hinzufügen)?

        Kommentar


        • #5
          Nein nein... wow wirklich schwer zu erklären.
          Ich habe einen Ordner mit Template Files, diese enthalten eigentlich ausschließlich HTML Content. Nur ein zwei Files haben eine simples Newsscript integriert, welches HTML ausgibt. Diese Inhalte sollen im String bevor gesucht wird, enthalten sein.
          Die Eingabe des Benutzers hat damit nichts zu tun. Es geht lediglich um die Aufbereitung des Suchsstrings die immer stattfindet.
          Google Search kommt nicht in Frage, die Suche funktioniert sonst perfekt

          Kommentar


          • #6
            Na dann machs doch mit Modifier e. Oder noch schlimmer mit eval.

            Aber wenn du in deinen Templates einfach so ein Newsscript per include einbinden kannst, dann kannst du dort auch beliebigen anderen Code stehen haben. Beispielsweise die Initialisierung von Variablen, die das Newsscript steuern. Wenn es heute noch nicht so ist, irgendwann kommts!
            Es genügt daher nicht, nur das Newsscript auszuführen. Du musst die ganzen Templates ausführen. Templates müssen aber vorher befüllt werden. Wo kommen die Templatevariablen her? (View, Action, Controller, Routing hast du vermutlich alles nicht.) Irgendwie musst du für die Templates den Kontext herstellen, den es bei einem normalen Request hat. Das geht wahrscheinlich nur ... *trommelwirbel* ... mit einem Request. Ergo HTTP.

            Kurzum: Wenn dein Newsscript komplett für sich allein funktioniert und es für alle Zeiten die einzige Ausnahme bleiben wird, dann /e. Sonst indizierte Suche, evtl. von extern (Google etc.)
            Zuletzt geändert von onemorenerd; 04.03.2010, 11:35.

            Kommentar


            • #7
              Verstehe deine Sicht der Dinge
              Gut der Anstoss mit eval() war schonmal Gold wert, danke dafür.
              Einen HTTP Request abzubilden wäre das Schlaueste, leider aber nicht das schnellste, daher teste ich erstmal das böse eval.
              Ich hoffe, damit keine Attackiermöglichkeit einzubauen... :-)

              Kommentar


              • #8
                Zitat von teco2008 Beitrag anzeigen
                Ich hoffe, damit keine Attackiermöglichkeit einzubauen... :-)
                Mit an Sicherheit grenzender Wahrscheinlichkeit schon.
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  Würde es jetzt so machen:
                  PHP-Code:
                  $string = eval('?>' . file_get_contents('template.tpl') . '<?');
                  Im Template steht dann der Include Befehl.

                  Wäre preg_replace mit e sicherer? Kann jemand mir einen Hinweis geben wie ich einen include über /e machen könnte?

                  Kommentar


                  • #10
                    Um Himmelswillen, ich hab eval doch nicht genannt damit du es benutzt. Das sollte dich abschrecken.

                    Denk mal diesen Ansatz durch:
                    PHP-Code:
                    <?php 
                    $content 
                    file_get_contents($templateFile);
                    if (
                    strpos('include("news.php");'$content)) {
                        
                    ob_start();
                        include 
                    'news.php';
                        
                    $news ob_get_clean();
                        
                    $content str_replace('include("news.php");''?>'.$news.'<?'$content);
                    }
                    // jetzt nach Suchbegriff in $content suchen
                    Wenn dein Newsscript nämlich wirklich so ein Spezialfall ist und sich daran niemals etwas ändern wird, dann ist dieser Ansatz sozusagen der darauf abgestimmte Spezialfall von eval.
                    Zuletzt geändert von onemorenerd; 04.03.2010, 12:12. Grund: Was ist denn heute mit den PHP-Tags los?

                    Kommentar


                    • #11
                      Zitat von onemorenerd Beitrag anzeigen
                      Um Himmelswillen, ich hab eval doch nicht genannt damit du es benutzt. Das sollte dich abschrecken.
                      Dieses Forum braucht dringend Ironie-Tags ...

                      @teco2008:

                      Du könntest die Aufgabenstellung in zwei Teile spalten.

                      1.) Ein "Indexing"-Script, welches in regelmäßigen Abständen oder nur dann, wenn sich was geändert hat, dein News-Script ausführt und die Ausgabe als Datei speichert:
                      PHP-Code:
                      <?php
                      // alle Ausgaben einfangen
                      ob_start();
                      // news.ph laden und ausfuehren
                      include('news.php'); 
                      // die Ausgaben in eine Datei speichern
                      file_put_contents('path/scan-me.txt'ob_get_clean());
                      ?>
                      2.) Das eigentliche Suchscript greift nur auf die Index-Datei zu:

                      PHP-Code:
                      // (ausserst primitives Beispiel)

                      // "Index"-File laden
                      $haystack file_get_contents(path/scan-me.txt);
                      // durchsuchen
                      if (FALSE !== strpos($haystack$needle)) {
                          
                      // ...

                      Zuletzt geändert von fireweasel; 04.03.2010, 21:28.
                      Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                      Kommentar


                      • #12
                        @onemorenerd:
                        Danke für deinen Denkanstoss!!! Funktioniert nun perfekt, nur die Parameterreihenfolge von strpos musst du umdrehen

                        @fireweasel:
                        stimmt, auch ein netter Lösungansatz. Vor allem falls die Performance irgendwann zu wünschen übrig lässt, aber momentan schaffe ich das alles noch in 0,7 Sekunden. Ab einer Sekunde werde ich dann indexen

                        Eine Frage noch:
                        Bekomme nun folgenden Notice Error:
                        Notice: ob_end_flush() [ref.outcontrol]: failed to delete and flush buffer. No buffer to delete or flush. in C:\xampp\xampp\htdocs\sqe33rfw\lib\search.php on line 153

                        Mein Source sieht nun so aus:
                        PHP-Code:
                                        /* News System interner Praxis News */
                                        include("fetchnews.php");
                                        $news = ob_get_clean();
                                        $string = str_replace('<?include("lib/fetchnews.php");?>', $news, $string);
                                        }
                                        if(strpos($string, '<?include("lib/fetchrss.php");?>')) {
                                        ob_start();
                                        /* RSS Fetcher */
                                        include("fetchrss.php");
                                        $rss = ob_get_clean();
                                        $string = str_replace('<?include("lib/fetchrss.php");?>', $rss, $string);
                                        }
                        Schönes Wochenende
                        T.
                        Zuletzt geändert von teco2008; 06.03.2010, 12:14.

                        Kommentar


                        • #13
                          Du rufst in Zeile 153 eine Funktion auf, die einen Output Buffer schließen soll, ohne dass zuvor einer geöffnet wurde.

                          Kommentar

                          Lädt...
                          X