Dennis: RegEx matched zu viel

Beitrag lesen

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.