1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Mein String ist kein String?

Dieses Thema im Forum "PHP" wurde erstellt von sowas aber auch o_, 26. April 2012.

  1. sowas aber auch o_

    sowas aber auch o_ Grünschnabel

    Hi,

    ich verzweifle hier grad an einem Problem und ich hoffe ihr könnte mir helfen.
    Wahrscheinlich ist es so banal, dass ich den Baum vor lauter Wald nicht sehe :rolleyes:

    Die Sache ist die:

    Ich lese mir den Quellcode einer Seite aus,
    schneide den Großteil mit stripos und substr weg, bis mir das gecuttete übrigbleibt:

    PHP:
    1.  $src_code = htmlspecialchars(file_get_contents($url));
    2.  
    3. /* trari trara schnipp schnapp*/
    4.  
    5. $src_code_cut = substr($src_code, $start, $laenge);
    6.  
    Jetzt will ich mit preg_match_all die Inhalte einer Tabelle auslesen, und da kommt jetzt das Problem.
    Der String $src_code_cut enthält nur noch den html-code mit der Tabelle, also:

    HTML:
    1. <table> ........ </table>
    genau so steht es auch da, über
    echo $src_code_cut.

    Wenn ich jetzt aber das als Quell-String für den preg_match_all eingebe:

    PHP:
    1.  
    2.  preg_match_all("|<th[^>]+>(.*)</t[^>]+>|U", $src_code_cut, $ausgabe, PREG_PATTERN_ORDER);
    3.  
    Und die Inhalte des Arrays auslesen will, dann kommt nix.

    Mache ich es aber so:

    PHP:
    1.  
    2.  preg_match_all("|<th[^>]+>(.*)</t[^>]+>|U", '<table> .... </table>', $ausgabe, PREG_PATTERN_ORDER);
    3.  
    dann kommen die Richtigen Ergebnisse.

    Was muss ich jetzt also mit meinem $src_code_cut tun, damit es von preg_match_all gelesen werden kann?


    Danke schonmal :)
  2. einfach nur crack

    einfach nur crack mag Cookies & Kekse

    Was gibt dir denn var_dump() aus? Ansonsten wäre der Teil zwischen deinem ersten Skriptschnipsel und deinem zweiten interessant.
  3. sowas aber auch o_

    sowas aber auch o_ Grünschnabel

    var_dump($src_code_cut) gibt aus:

    string(laenge) ""
    und dahinter die Tabelle, aber von html interpretiert und nicht als code.


    Was bei mir genau passiert ist das:

    PHP:
    1.  
    2. $start = htmlspecialchars('<table>');
    3.    
    4. $end = htmlspecialchars('</table>');
    5.  
    6.  
    7. $start_pos = stripos($src_code, $start);
    8. $end_pos = stripos($src_code, $end);
    9.  
    10. $src_code_cut = substr($src_code, $start_pos, strlen($src_code)-((strlen($src_code)-$end_pos)+$start_pos));
    11.  
    12. preg_match_all("|<th[^>]+>(.*)</t[^>]+>|U", $src_code_cut, $ausgabe, PREG_PATTERN_ORDER);
    13.  
    14. echo $ausgabe[0][0] . "<br>";
    15. echo $ausgabe[0][1] . "<br>";
    16. echo $ausgabe[0][2] . "<br>";
    17. echo $ausgabe[0][3] . "<br>";
    18. echo $ausgabe[0][4] . "<br>";
    19. echo $ausgabe[0][5] . "<br>";
    20.  
    Da gibt es jetzt wie gesagt keine Ausgabe für $ausgabe[][].

    Ersetzt man im preg_match_all das $src_code_cut mit dem String
    '<table>.....</table>'
    Dann geht es Problemlos.

    Ich hatte es auch schon mit htmlspecialchars($src_code_cut) probiert, aber dann gibt es auch keine ausgabe und im Vardump ist dann eh alles wirr.
  4. Anna Bolika

    Anna Bolika Erfahrenes Mitglied

    Dein Problem liegt bei htmpspecialchars() - das verändert die Größer-Als und Kleiner-Als-Zeichen. Damit läuft dein Regex natürlich ins Leere. Also alle wegmachen und zum Schluss über das fertige Ergebnis laufen lassen, falls du htmpspecialchars() wirklich benötigen solltest. Sollen die Daten denn überhaupt in ein Eingabefeld?

    Außerdem hast du ein Problem in deinem Regex:
    Code (PHP):
    1. preg_match_all("|<th[^>]+>(.*)
    Das Plus-Zeichen muss ein Stern sein, sonst findest du nur th-Tags, die auch Attribute haben.
  5. sowas aber auch o_

    sowas aber auch o_ Grünschnabel

    Wenn ich htmlspecialchars() wegmache, dann gibt es leider auch keine Ergebnisse.
    Dann kann er nichtmal stripos und substr ausführen.

    Ich bekomm hier gleich die Kriese :D


    Das mit den Atributen ist schon ok so :)
    aber danke
    Zuletzt bearbeitet: 27. April 2012
  6. chmee

    chmee mod | media Moderator

    Du bist Dir auch sicher, dass Dein Regex richtig ist?

    Und warum machst Du erstmal ein String-Funktionen-Kauderwelsch, wenn Du gleichermaßen Regex in einer Zeile verwenden kannst, uU mit weniger Problemen?

    Ich nehme als Auslesebasis das table/th-Beispiel von selfhtml
    http://de.selfhtml.org/html/tabellen/aufbau.htm

    und lasse lediglich zwei Regex rüberlaufen und bin schon am Ziel.
    Code (PHP):
    1. # wir suchen nur einen table-Fund.
    2. $regex = "#<table(.*?)>(.*?)</table>#ims";
    3. preg_match ($regex, $string, $outputA);
    4.  
    5. # und dann suchen wir mehrere th
    6. $regex = "#<th>(.*?)</th>#ims";
    7. preg_match_all ($regex, $outputA[1], $outputB);
    8.  
    9. foreach($outputB[1] as $thFund)
    10. {
    11.   echo $thFund."<br/>";
    12. }
    13.  
    mfg chmee

Diese Seite empfehlen