(PHP) regex: alles auslesen zwischen <li> und </li>
Ich versuche mich grade an regex und sobald es mal etwas komplizierter wird brauche ich immer hilfe, weil ich es einfach nicht kapiere...
Mein Hauptproblem sind mehrzeilige Quelltexte und HTML-Quelltexte sind meistens mehrzeilig :-)
So ein Pseudo-Regex-Code ist schnell geschrieben:
<li>(.+?)</li>
die sternchen stehen für: hier kann alles vorkommen und das (.+?) heisst wie auch in echt: Das will ich haben ;-)
Eigentlich ganz einfach, aber wie muss meine Expression aussehen?
Danke!
6 Stimmen
4 Antworten
preg_match_all("#<li(.*)>(.*)<\/li>#", $dein_string, $output_as_array);
print_r($output_as_array);
> "#<li(.)>(.)<\/li>#"
Normalerweise sind reguläre Ausdrücke gierig, (greedy) bei diesem Ausdruck würde ich annehmen, daß der Ausdruck alles nach <li bis zum Zeilenende "frißt".
Sinnvolle Modifier: U: Ungreedy: möglichst wenig - irgendwelche Zeichen - suchen
s: . matcht auch auf Zeilenende. Ein Zeilende könnte ja in dem <li> Tag vorkommen.
Besser also: "#<li(.)>(.)<\/li>#Us"
Ich würde allerdings eine Negation bevorzugen: '~<li>([^<]+)</li>~'
Also 1 oder mehr Zeichen, die nicht in den eckigen Klammern vorkommen. Zirkumflex vorangestellt, negiert den Inhalt der Klammern.
Hoffe, es wird richtig angezeigt :D Viel Spaß!
Bei dem Tag
wirst Du eher preg_match_all (http://php.net/manual/de/function.preg-match-all.php) benötigen, da preg_match bei der ersten Übereinstimmung die Suche beendet und es sicher mehrere gibt.Hier ein kleiner Code der den TITLE einer Seite ausliest - leite es einfach ab! Ersetze <title></title> mit <li></li>
$content = @file_get_contents("http://www.test.de");
$preg_one = preg_match("!<title>(.*?)</title>!", $content, $ergebnis);
echo $ergebnis[1];
ja der title steht meistens in einer zeile. was ist wenn der content so aussieht:
<p><title>Hallo\n Das Ist\n Völliger Schwachsinn</title></p>
Also Ich komme jetzt mit $regex = '/<li(.+?)>(.+?)<\/li>/is'; ganz gut aus!