Yann: Bestimmten String finden

Hallo Leute!

Folgendes: Ich habe HTML-Code in einer MySQL-DB gespeichert. In diesem Code befinden sich Strings wie z.B. "<blabla.html>".

Nun möchte ich diese Strings herausfiltern um Sie weiterverarbeiten zu können, bloss wie mache ich das am Besten? Ich kann ja nach dem String "<" suchen, doch weiss ich nicht, was nach diesem Part kommt. Wie kann ich nun am Besten nach dem gesamten String suchen? Also eine Funktion die nach dem "[link:" als Anfang sucht und dann alles bis zum ">" in eine Variable schreibt.

Eigentlich sollte es nicht so schwer sein, aber ich grad nen richtigen Knoten im Kopf.

btw: Die Links nach dem "link:" sind keine Fantasie-Geschichten, auch diese sind in einer Tabelle abgespeichert, aber ich möchte nicht den Tabellen-Inhalt Datensatz für Datensatz durchgehen und per String-Funktion mit dem Gesamttext abzugleichen. Das ist mir zuviel Traffic.

Weiss jemand Rat?

Beste Grüsse
Yann

  1. Folgendes: Ich habe HTML-Code in einer MySQL-DB gespeichert. In diesem Code befinden sich Strings wie z.B. "<blabla.html>".

    Nun möchte ich diese Strings herausfiltern um Sie weiterverarbeiten zu können, bloss wie mache ich das am Besten? Ich kann ja nach dem String "<" suchen, doch weiss ich nicht, was nach diesem Part kommt. Wie kann ich nun am Besten nach dem gesamten String suchen? Also eine Funktion die nach dem "[link:" als Anfang sucht und dann alles bis zum ">" in eine Variable schreibt.

    Was ist, wenn mehrfach in einem Datenfeld so etwas vorkommt? In der Ergebnismengen kannst du das nicht aufschlüsseln.

    Eigentlich sollte es nicht so schwer sein, aber ich grad nen richtigen Knoten im Kopf.

    Die zielführenste Lösung (MySQL-Erweiterungen zu nutzen, von denen ich jetzt keine wüsse, die das geforderte erfüllt) ist es, mit MySQL nur vorzusortieren:

    Alles selektieren welches zumindest ein < und ein > enthält.

    Diese Ergebnismenge wird dann mit PHP weiterbearbeitet und auf das tatsächliche Resultat zusammengefiltert.

    btw: Die Links nach dem "link:" sind keine Fantasie-Geschichten, auch diese sind in einer Tabelle abgespeichert, aber ich möchte nicht den Tabellen-Inhalt Datensatz für Datensatz durchgehen und per String-Funktion mit dem Gesamttext abzugleichen. Das ist mir zuviel Traffic.

    Siehe oben: wenn du alles holst, was < und > enthält hast du mit hoher wahrscheinlichkeit nur einträge, die dies auch tatsächlich beinhalten - zusätzlich kannst du das noch mit z.B. SUBSTR() eingrenzen, um den traffic zu verkleinern, damit PHP wirklich nur das notwendigste erhält.

    1. Hallo!

      Danke für Deine Antwort.

      Wie meinst Du das genau mit MySQL vorsortieren? Ich möchte schon den Text wie er ist ausgeben, nur die darin enthaltenen Tags sollten verarbeitet werden.

      In einem früheren Script hatte ich auch mal solche Tags, damals hatte ich das so bewerkstelligt: Ich hatte eine CSV-Liste der möglichen Tags. Mit einer While-Schleife bin ich dann einfach diese Liste durchgegangen und habe dann auf den grossen Text ein Replace durchgeführt.

      Auch hier habe ich alle möglichen Tags gespeichert, diesmal jedoch in einer Datenbank-Tabelle. Ich könnte natürlich wiederum alle in einer Schleife auslesen und dann jedesmal ein Replace ausführen, aber es gibt mehrere Dutzend, d.h. mehrere Dutzend Replaces ausführen, das macht auch wenig Sinn, oder?

      Ich habe auch schon folgendes versucht: 2 Replaces auszuführen und zwar eines ersetzte "<" und eines ">", und zwar so, dass es dann einen PHP-Funktionsaufruf ergibt. Wenn ich dann aber das per Echo ausgebe, interpretiert er den PHP-Code nicht.

      Deshalb suche ich nach einem Weg, wie ich den gesamten Tag (bzw. alle vorhandenen im Text) in eine Variable bzw. Array bekomme.

      Weiss jemand Rat?

      Gruss, Yann

      1. Wie meinst Du das genau mit MySQL vorsortieren? Ich möchte schon den Text wie er ist ausgeben, nur die darin enthaltenen Tags sollten verarbeitet werden.

        Mit MySQL oder PHP?

        In einem früheren Script hatte ich auch mal solche Tags, damals hatte ich das so bewerkstelligt: Ich hatte eine CSV-Liste der möglichen Tags. Mit einer While-Schleife bin ich dann einfach diese Liste durchgegangen und habe dann auf den grossen Text ein Replace durchgeführt.

        Und was hindert dich daran, es wieder so zu machen? Hört sich nach 10 Zeilen PHP an.

        Auch hier habe ich alle möglichen Tags gespeichert, diesmal jedoch in einer Datenbank-Tabelle. Ich könnte natürlich wiederum alle in einer Schleife auslesen und dann jedesmal ein Replace ausführen, aber es gibt mehrere Dutzend, d.h. mehrere Dutzend Replaces ausführen, das macht auch wenig Sinn, oder?

        Du kannst Zeichenkettenfunktionen auch verschacheln oder eine Benutzerdefinierte Funktion verwenden (hört sich nach unnötig viel Arbeit an) - aber es hört sich alles danach an, als würdest du das in MySQL machen wollen - warum wählst du den Themenbereich PHP?

        Ich habe auch schon folgendes versucht: 2 Replaces auszuführen und zwar eines ersetzte "<" und eines ">", und zwar so, dass es dann einen PHP-Funktionsaufruf ergibt. Wenn ich dann aber das per Echo ausgebe, interpretiert er den PHP-Code nicht.

        Welcher PHP-Code? Du sagtest, du hättest HTML in der Datenbank stehen.

        Deshalb suche ich nach einem Weg, wie ich den gesamten Tag (bzw. alle vorhandenen im Text) in eine Variable bzw. Array bekomme.

        Wozu?

        Weiss jemand Rat?

        Deine Schallplatte hängt - aber ich versuchs mal so:

        Beschreibe bitte Prozedural was wo wann in welchem System passieren soll:

        • in der MySQL-Datenbank steht 'foo bar http://example.com qux" in tabelle1, in feld1
        • die Abfrage soll alle ...

        Wenn wir da haben, reden wir weiter.

      2. Hello,

        Weiss jemand Rat?

        Du müsstest schon etwas genauer beschreiben, wie dein System aufgebaut ist.
        Gib uns mal einen Beispieltext.

        Da Du 'PHP' als Kategorie gewählt hast, vermute ich, dass Du den Datensatz aus der Datenbankl erst ausliest und ihn dann in PHP verarbeiten willst. Stimmt das?

        Dann ist es doch relativ einfach, alle Vorkommen von <########> zu finden. Das kannst Du entweder mit Stringfunktionen bewerkstelligen, oder aber mit regular Expressions.

        Dann stellst Du Dur ein Array zusammen:

        Anfang des Ausdrucks
          Länge des Ausdrucks
          enthaltender Index
          Ersatzwert

        und das kannst Du dann anschließend nutzen, um die Ersetzungen im Text durchzuführen

        Mit dem Index kannst Du, wenn dein Datenmodell stimmt, direkt auf den Ersatzwert in der Datenbanktabelle zugreifen.

        Ich würde da auch keine unterschiedlich(en) (langen) Ausdrücke als Index zulassen, sondern immer eine mit führenden Nullen oder Leerzeichen aufgefüllte numerische ID, die dann direkt als Fremdschlüssel in Bezug zum Primary-Key der Ersetzugnstabelle benutzt werden kann.

        Das ermöglicht nämlich die Verwendung von Stringfunktionen anstelle von regular Expressions, was die ganze Verarbeitung sehr viel billiger macht und sogar eine Abarbeitung direkt in der Datenbank möglich macht (ohne dass die stehen bleibt).

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
      3. ..., nur die darin enthaltenen Tags sollten verarbeitet werden.

        Ich hatte dazu mal eine kleine Funktion geschrieben: TagIdent()
        Sie tut genau dies: such einen frei definierbaren Tag und finde seinen "Inhalt". Mit einer weiteren Funktion TagReplace() kann man das einfach verarbeiten.

          
        <?php  
        function TagIdent($string, $open, $close){  
          
          $start_pos = strpos($string, $open);  
          if(!is_int($start_pos))     return false;  
          if($start_pos < 0)          return false;  
          
          $end_pos   = strpos($string, $close, $start_pos+strlen($open)) + strlen($close);  
          if(!is_int($end_pos))       return false;  
          if($end_pos <= $start_pos)  return false;  
          
          $tag = array();  
          $tag["startpos"]   = $start_pos;  
          $tag["endpos"]     = $end_pos;  
          $tag["length"]     = $tag["endpos"] - $tag["startpos"];  
          $tag["tag"]        = substr($string, $tag["startpos"], $tag["length"]);  
          $tag["tagcontent"] = substr($tag["tag"],strlen($open),-strlen($close));  
          
          return $tag;  
          
        }  
          
        function TagReplace($string, $tag_old, $tag_new){  
          
          $a = strpos($string,$tag_old);  
          $o = strlen($tag_old);  
          $string = substr_replace($string, $tag_new, $a, $o);  
          
          return $string;  
          
        }  
        ?>
        

        Deshalb suche ich nach einem Weg, wie ich den gesamten Tag (bzw. alle vorhandenen im Text) in eine Variable bzw. Array bekomme.

        Das könntest Du so ansprechen:

          
        <?php  
        $string = "this text contains a [link:to.a.target.html] and a [link:tohome.php]. Enjoy it.";  
          
        var_dump($string);  
          
          
        while($Tag = TagIdent($string, "[link:", "]")){  
          
          $string = TagReplace($string, $Tag["tag"], "<a href='".$Tag["tagcontent"]."'>".$Tag["tagcontent"]."</a>");  
          
        }  
          
        var_dump($string);  
        ?>
        

        string 'this text contains a <to.a.target.html> and a <tohome.php>. Enjoy it.' (length=79)

        string 'this text contains a <a href='to.a.target.html'>to.a.target.html</a> and a <a href='tohome.php'>tohome.php</a>. Enjoy it.' (length=121)

        In der While-Schleife würdest Du dann Deinen Array bauen. Etwa: $allTags[] = $Tag["tagcontent"] oder so...

        Die Funktion hat Fehlerpotential, wenn der Tag nicht sauber geschlossen wurde (aus Deiner DB).

        Cheers,
        Baba