Mein String ist kein String?

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:
 $src_code = htmlspecialchars(file_get_contents($url));

/* trari trara schnipp schnapp*/

$src_code_cut = substr($src_code, $start, $laenge);

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:
<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:
 preg_match_all("|<th[^>]+>(.*)</t[^>]+>|U", $src_code_cut, $ausgabe, PREG_PATTERN_ORDER);

Und die Inhalte des Arrays auslesen will, dann kommt nix.

Mache ich es aber so:

PHP:
 preg_match_all("|<th[^>]+>(.*)</t[^>]+>|U", '<table> .... </table>', $ausgabe, PREG_PATTERN_ORDER);

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 :)
 
Was gibt dir denn var_dump() aus? Ansonsten wäre der Teil zwischen deinem ersten Skriptschnipsel und deinem zweiten interessant.
 
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:
$start = htmlspecialchars('<table>');
    
$end = htmlspecialchars('</table>');

$src_code = htmlspecialchars(file_get_contents($url));

$start_pos = stripos($src_code, $start);
$end_pos = stripos($src_code, $end);

$src_code_cut = substr($src_code, $start_pos, strlen($src_code)-((strlen($src_code)-$end_pos)+$start_pos));

preg_match_all("|<th[^>]+>(.*)</t[^>]+>|U", $src_code_cut, $ausgabe, PREG_PATTERN_ORDER);

echo $ausgabe[0][0] . "<br>";
echo $ausgabe[0][1] . "<br>";
echo $ausgabe[0][2] . "<br>";
echo $ausgabe[0][3] . "<br>";
echo $ausgabe[0][4] . "<br>";
echo $ausgabe[0][5] . "<br>";

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.
 
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:
PHP:
preg_match_all("|<th[^>]+>(.*)

Das Plus-Zeichen muss ein Stern sein, sonst findest du nur th-Tags, die auch Attribute haben.
 
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:
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.
PHP:
# wir suchen nur einen table-Fund. 
$regex = "#<table(.*?)>(.*?)</table>#ims";
preg_match ($regex, $string, $outputA);

# und dann suchen wir mehrere th
$regex = "#<th>(.*?)</th>#ims"; 
preg_match_all ($regex, $outputA[1], $outputB);

foreach($outputB[1] as $thFund)
{
  echo $thFund."<br/>";
}

mfg chmee
 

Neue Beiträge

Zurück