Tim: brauche Reg-Exp Hilfe :)

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.

  1. 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ß

    1. 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.

      1. 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*

  2. 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

  3. 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.