brauche Reg-Exp Hilfe :)
Tim
- programmiertechnik
Also ich bin eher ein Neueinsteiger in Sachen Regular Expressions. Deshalb wäre ich für einen kleinen Tipp sehr dankbar :).
Mein Problem:
Ich will aus folgendem html-code ein bestimmtes Stück herrausfiltern:
[code=html]
<html><head></head><body><table><tr><td><a href="test.html">test</a></td></tr><tr><td bgcolor="#ffffff"><a href="test2.html?p=1">test</a></td></tr><tr><td bgcolor="#dddddd"><a style="color:red;" href="test2.html?p=2">test</a></td></tr></table></body></html>
[/code]
(Der Code enthält keine Zeilenumbrüche)
und ich möchte einige Teile herrausfiltern, undzwar:
beginnend mit einem "<tr>" und endend mit einem "</tr>". Innerhalb dieser "Begrenzung" soll in dem Link "test2.html" vorkommen.
Also in diesem Beispiel sollen folgende Teile gefunden werden:
[code=html]
<tr><td bgcolor="#ffffff"><a href="test2.html?p=1">test</a></td></tr><tr>
[/code]
und
[code=html]
<tr><td bgcolor="#dddddd"><a style="color:red;" href="test2.html?p=2">test</a></td></tr>
[/code]
Ich habe auch schon einen ersten Ansatz eines Suchmusters:
suchmuster = "/<tr>.*test2.html.*</tr>/i";
Allerdings bekomme ich dabei immer einen viel zu großen Abschnitt:
[code=html]
<tr><td><a href="test.html">test</a></td></tr><tr><td bgcolor="#ffffff"><a href="test2.html?p=1">test</a></td></tr><tr><td bgcolor="#dddddd"><a style="color:red;" href="test2.html?p=2">test</a></td></tr>
[/code]
Also quasi das allererste "<tr>" bis zum allerletzten "</tr>".
Tjoa, das ist jetzt sozusagen meine Frage: Wie bekomm ich das, was ich finden will und nicht so viel :)
Greetz, Tim.
Hallo,
Tjoa, das ist jetzt sozusagen meine Frage: Wie bekomm ich das, was ich finden will und nicht so viel :)
Greetz, Tim.
ich habe heute diesen Link bekommen, er ist sehr hilfreich:
PCRE Evaluator
nicht so viel..
Modifier U (Gier unterdrücken) ausprobieren...
Gruß
huhu,
Danke erstmal für den Hinweis des Testers, aber davon habe ich schon jede Menge gefunden :).
Ich glaube ich werd das ganze mit mehreren RegExp Ausdrücken machen, das ist denke ich für Einsteiger wie mich einfacher :).
Greetz, Tim.
Danke erstmal für den Hinweis des Testers, aber davon habe ich schon jede Menge gefunden :).
Ach ja! Auch so schöne wie "PCRE Evaluator"? Wenns sowas auch "standalone" gibt, poste mal noch deine Links...
Wäre freundlich...
Thomas*
gudn tach!
in welcher sprache moechtest du das umsetzen? php?
regulaere ausdruecke werden nicht in allen sprachen gleich gehandhabt.
vielleicht helfen schon zwei fragezeichen, die den bestandteil .* nicht soviel wie moeglich, sondern so wenig wie noetig matchen lassen:
/<tr>.*?test2.html.*?</tr>/i
prost
seth
Hi Tim,
Ich habe auch schon einen ersten Ansatz eines Suchmusters:
suchmuster = "/<tr>.*test2.html.*</tr>/i";
Allerdings bekomme ich dabei immer einen viel zu großen Abschnitt:
<tr><td><a href="test.html">test</a></td></tr>
<tr><td bgcolor="#ffffff"><a href="test2.html?p=1">test</a></td></tr>
<tr><td bgcolor="#dddddd"><a style="color:red;" href="test2.html?p=2">test</a></td></tr>
>
> Also quasi das allererste "<tr>" bis zum allerletzten "</tr>".
Den Hinweis auf die „Gefräßigkeit“ von RegEx hast du ja schon bekommen - standardmäßig passt ein .\* immer auf so viel wie möglich, dieses Verhalten lässt sich abschalten, indem du hinter das /i noch ein U schreibst.
Ich würde den RegEx an sich aber auch noch etwas verbessern - zur Zeit würde er auch passen, wenn test2.html da drin stehen hast, auch wenn es nicht verlinkt ist.
Mein Ansatz:
/<tr>.\*<a[^>]\*href="test2\.html"[^>]\*>.\*<\/tr>/iU
Das bedeutet: Zuerst muss ein <tr> kommen, dann kann etwas beliebiges kommen, dann muss <a href="test2.html"> kommen, es darf aber auch <a class="link" href="test2.html"> oder <a href="test2.html" class="link"> sein, dann darf wieder beliebiger Text kommen und am Ende muss noch mal ein </tr> sein.
Dadurch würde also nun ein `<tr><td>Das test2.html ist kein Link</td></tr>`{:.language-html} nicht gefunden.
Je nach dem in welcher Programmiersprache du arbeitest (was du gepostest hattest, sah nach PHP aus) musst du den RegEx dann mit einer entsprechenden Funktion verarbeiten - in PHP müsstest du [preg_match_all()](http://php.net/preg_match_all) verwenden, um an alle Funde ranzukommen, dass könnte z.B. so aussehen:
~~~php
$pattern = '/<tr>.*<a[^>]*href="test2\.html"[^>]*>.*<\/tr>/iU';
$subject = 'zu durchsuchenden html code';
$matches = array(); // Array für die Funde
$success = preg_match_all($pattern, $subject, $matches);
if($success === false) {
echo "Es ist ein Fehler aufgetreten";
}
elseif($success > 0) {
echo "Es wurden $success Stellen gefunden:\n";
print_r($matches);
}
else {
echo "Es wurden keine Stellen gefunden.";
}
MfG, Dennis.