newsseiten anzapfen

aha =) ich versteh trotzdem nicht ganz, warum in der zeile:

PHP:
preg_match_all("/<item>(.+)</item>/sU", $data, $items);

dieser fehler kommt:

Warning: Unknown modifier 't' in xxx on line x

regex's sind ja nun nicht ganz so einfach *g* gibts da irgendwo eine ausführliche doku? vieleicht komm ich ja selber drauf :)

nachtrag:

ok, ich kann ja mal anfangen den preg zu analysieren :)
also das "s" am ende bewirkt, das der preg als ein langer string behandelt/gespeichert wird. "/" ist der delimiter, "U" = PCRE_UNGREEDY... kann ich jetzt nicht genau erklären, hab ich hier gefunden *g*

die "()" schliessen ein teilsuchmuster ein, aber ".+" versteh ich nich :(
 
Zuletzt bearbeitet:
hab's!

so gehts...

PHP:
<?
$data = join("", file("http://www.heise.de/newsticker/heise.rdf"));
preg_match_all("=<item>(.+)</item>=sU", $data, $items);

foreach ($items[1] as $item) {
 preg_match("=<title>(.+)</title>=U", $item, $title);
 preg_match("=<link>(.+)</link>=U", $item, $link);
 echo "<a href=\"$link[1]\">$title[1]</a><br>";
}
?>

also nur den escape char mit "=" austauschen. warum kann vieleicht jemand anders erklären !? *g*

nachtrag: dann mal her mit einem xml parsing tut *g* !!!
 
Zuletzt bearbeitet:
So, ich hab den Thread hier zufällig wieder gefunden und meld mich gleich mal zu Wort :)

Das Problem bei dem von mir angegebenen Quelltext war, dass das Forum ab und zu Slashes unterschlägt.

Code:
/<item>(.+)</item>/sU
Das '/' bei </item> wird hier als Delimiter aufgefasst. PHP meint also, dass danach nur noch Modifikatoren sind, welche ja aber erst nach dem letzten '/' stehen. Um den Slash zu entwerten, muss also ein Escape-Zeichen davor (ist übrigens ein Backslash ('\'), kein Slash ('/')). Das hab ich auch in meinem Quellcode so, nur leider hat sich wie gesagt das Forum hier bedient ;)

Selbiges gilt natürlich auch für die anderen regulären Ausdrücke in meinem Code.

Wenn du natürlich jetzt schlauerweise '=' als Delimiter benutzt, stört PHP der Slash mitten im String nicht mehr :)


Um deine anderen Fragen zu beantworten:

Der Ausdruck '.+' besagt folgendes:
Gesucht wird nach allen Zeichen ('.'), finde eines oder mehr davon ('+').

Die Modifier, die ich hier verwendet habe, sind folgende:
s: Führt dazu, dass '.' auch Newline-Character einschließt.
U: ungreedy = "nicht gierig". Reguläre Ausdrücke sind, sofern nicht anders angegeben, immer "gierig".

Beispiel:
Code:
Dies ist nur ein Beispielsatz. Ein weiterer folgt darauf.
Wenn man jetzt mit Hilfe regulärer Ausdrücke den ersten Satz isolieren möchte, kommt man zu folgendem Ansatz:
Code:
/(.+)\./
D.h.: Suche nach allen Zeichen (mindestens eines davon, dürfen aber auch mehr sein). Danach soll ein Punkt kommen. Blöderweise liefert das aber folgendes Ergebnis:
Code:
Dies ist nur ein Beispielsatz. Ein weiterer folgt darauf
Wieso? PHP ist gierig. Es versucht immer so viel zu bekommen, wie es nur grade kann. Und am meisten bekommt es, wenn es den Punkt vom ersten Satz in die Menge (.+) einschließt (der Punkt gehört ja auch zu 'alle Zeichen') und den Punkt vom zweiten Satz als den gesuchten Punkt interpretiert.

Wenn man jetzt den Modifier "ungreedy" benutzt, versucht PHP immer so wenig wie möglich zu bekommen. Es bricht also schon beim ersten Punkt ab und liefert das gewünschte Ergebnis:
Code:
Dies ist nur ein Beispielsatz


So, ich hoffe dass jetzt alle Klarheiten damit beseitigt sind :-)


Wegen dem XML-Parsing-Tut muss ich dich leider enttäuschen, das kann noch länger dauern. Vor allem wenn es wirklich ausführlich werden soll. Es sind zwar im Grunde nur an die 100 Zeilen Code. Aber die haben es dafür in sich (reguläre Ausdrücke, Rekursion, Validation, Stringoperationen... bis zum Abwinken).

Aber ein rdf-Parsing-Tut sollte machbar sein. Mal sehen, wann ich mal Zeit hab ;)
 
Zurück