reguläre Ausdrücke und Links

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • reguläre Ausdrücke und Links

    Hallo Zusammen,

    habe ein Problem mit regulären Ausdrücken.

    Wenn ich folgenden preg_match durchführe, bekomme ich nur den zwetern Teil der regexp raus.
    Ich möchte aber zuerst den link raus filtern, dann denn dazugehörigen Titel, der nach dem >title</a kommt.

    Was fehlt mir?

    Ich brauche auf einer bookmark.html seite:

    PHP Code:
    <DL><p>
                <
    DT><H3 ADD_DATE="1206958129" LAST_MODIFIED="1207589350" ID="rdf:#$Bm.0T3">robby williams</H3>
                <
    DL><p>
                    <
    DT><A HREF="http://youtube.com/watch?v=jEEivzKgZh0" ADD_DATE="1179418344" LAST_VISIT="1207589303" LAST_MODIFIED="1179418361" ICON="data:image/x-icon;
    base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAABMLAAATCwAAAAAAAAAAAAD
    //////////4OD//9paf//bm7//2Fh//9ZWf//Wlr//1pa//9WVv//ZGT//3Bw//9jY///goL//////////////////
    11d//8sLP//QUH//ygo//84OP//RET//y4u//8xMf//UVH//y4u//8PD///ZWX//x0d//9aWv////////////
    88PP//Cgr///////8zM///1NT///////+lpf//ubn///////+urv//fHz////////g4P//Fhb/////////////MzP//
    woK////////NDT//8vL//9ycv//paX
    //7Cw//9jY///s7P//8nJ//9XV///eXn//yIi/////////////zMz//8LC///+/v//zMz///Gxv//hYX//6Ki//+srP//
    W1v//6ys//+3t///2tr//93d//8PD/////////////80NP//AgL///b2//8nJ///5ub//56e//+5uf//oaH//+/v//+5uf//oKD//+Li///f3///AgL
    /////////////MzP//wUF////////Skr//0pK//9NTf//NTX//97e//+ysv//Nzf//xIS//+mpv//Kyv//z09/////////////xkZ///Y2P////////////
    8nJ///EBD//wAA///y8v//Ly///wAA//8mJv//Hh7//6mp//92dv////////////+vr///Jib//xMS//8eIP//MzP
    //zY2//84OP//Hh///y4u//9XV///hoj//8LC///R0f//qqr/////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////AAAA/8zMzP/u7u7/IiIi/wAAAP8iIiL//////zMzM/8AAAD/AAAA
    /////////////////////////////////wAAAP/MzMz//////yIiIv/u7u7/ERER/7u7u/8AAAD/iIiI/xEREf///////////////////////////
    +7u7v8AAAD/zMzM//////8iIiL/7u7u/xEREf+7u7v/AAAA/8zMzP8RERH///////////////////////////
    93d3f/AAAA/1VVVf/u7u7/IiIi/wAAAP8iIiL//////wAAAP/MzMz/ERER///////////////////////
    d3d3/AAAA/4iIiP8AAAD/3d3d/////////////////////////////////////////////////////////////////wAAAP//////AAAA
    ////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" 
    LAST_CHARSET="UTF-8" ID="rdf:#$92tFv">
    YouTube  Robbie 
    Williams 
    Misunderstood (Live TOTP)</A>
                </
    DL><p
    !!Als Beispiel!!!!

    http://youtube.com/watch?v=jEEivzKgZh0

    und

    YouTube - Robbie Williams - Misunderstood (Live @ TOTP)


    Hier der PHP Code:

    PHP Code:
    <?

    $lines = file ('bookmarks.html');
    #print_r($lines);
    // Durchgehen des Arrays und Anzeigen des HTML Source inkl. Zeilennummern
    foreach ($lines as $line) {
        preg_match("#(<A(?:.*)?HREF=\"(.*)\"(?:.*)?ADD_DATE)?(\s-.+</a>)#isu",$line,$match);
        
        echo "<pre>";
        print_r($match);
    }

    ?>
    Danke schonmal vorab für eure Tips.
    gruss pedro

  • #2
    Auf die Schnelle gebe ich dir mal einen Tipp, der in eine andere Richtung geht: Performance.
    Beschäftige dich mal etwas eingehender mit dem Punkt (.) und was er bewirkt. Drei .* bzw. .+ in einem einzigen Ausdruck... Das mag gut gehen, solange die Engine auch findet, wonach sie sucht. Sobald aber keine Übereinstimmungen gefunden werden, geht dein Ausdruck in die Knie und sucht in puncto mangelhafter Performance seinesgleichen.

    Eine weit bessere Lösung wäre die Benutzung von negierten Charakterklassen. Als Beispiel:
    Code:
    /<a\shref\s*=\s*"([^"]+)"\s*>.../
    Grüße
    Last edited by Griecherus; 03-05-2008, 21:44.
    Nieder mit der Camel Case-Konvention

    Comment


    • #3
      ja man bastelt so rum, guggt hier und da im netz. und so schustert man sich eine regexp zusammen und is froh das es irgendwie geht... das passiert dann bei magelnden verständnis für die sache... nur wenn es sooo einfach wäre, hätte ich es schon
      danke für den tip. ich werde es beachten ;o)
      gruss pedro

      Comment


      • #4
        erledigt
        Last edited by petro_0; 03-05-2008, 22:16.
        gruss pedro

        Comment


        • #5
          Moin!

          Ich suche nach einer Möglichkeit, in einem Text vorkommende Urls (in der Form [a href="http://www.blablablub.de/index.php?id=123]blub[/a]") derart zu verändern, daß die Adresse durch "http://blah.de/blub.php" ersetzt und die Id-Nummer um 10000 erhöht wird.

          Nach langem Ausprobieren stelle ich fest, daß ich offenbar kein Händchen dafür habe. Könnte mir da jemand behilflich sein? Dank im voraus!

          Gruß
          Wodan

          Comment


          • #6
            Zeig doch mal, was du alles ausprobiert hast. Möglicherweise bist du ja einer Lösung sehr nahe, so dass wir dich nur noch in die richtige Richtung schubsen müssen, statt dir eine fertige Lösung abzuliefern.

            @Petro_0: Poste doch bitte deine Lösung, damit auch andere Leute, die bei ihrer Suche auf dieses Thema stoßen, Nutzen davon haben.

            Grüße
            Nieder mit der Camel Case-Konvention

            Comment


            • #7
              PHP Code:
              $suchmuster=',<a([^>]+)href="(?!https?://|[url]ftp://[/url]|mailto:
              |news:)([^>"\s]+)",i'
              ;
              $ersetzen='<a\1href="http://blah.de/blub.php?id="';
              echo 
              preg_replace($suchmuster$ersetzen,
              '<a href="http://www.blablablub.de/index.php?id=123" target="_blank">blub</a>'); 
              Das ist alles, was ich habe. Das ist ein Beispiel, das ich irgendwo in den Weiten des Netzes gefunden habe und das meinem Bedürfnis einigermaßen nahekommt. Der Austausch der Adresse funktioniert, nur an der id beiß ich mir die Zähne aus. Ich finde auch nichts, wo das für Ahnungslose gut erklärt wird.

              Nachtrag: Die erste Zeile hat mir das Forum verstümmelt.
              Last edited by Wodan; 05-05-2008, 16:15.

              Comment


              • #8
                Ein klarer Fall für einen RegExp mit Callback-Funktion z.B.
                PHP Code:
                function increment($var){
                  
                $ret $var[2] + 1000;
                  return 
                '<a '.trim($var[1]).' href="http://blah.de/blub.php?id='.trim($ret).'" '.trim($var[3]).'>';
                }
                $reg '/<a(.*)href="[^?]*\?.*id=(\d*?)"([^>]*)>/U';
                echo 
                preg_replace_callback('/<a(.*)href="[^?]*\?.*id=(\d*?)"([^>]*)>/U',"increment",$str); 
                Habe das bei mir mal Online gestellt

                Gruss

                tobi

                p.s. bitte noch den Code etwas umbrechen!
                Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                Comment


                • #9
                  Das funktioniert ja wunderprächtig. Vorzüglichsten Dank!

                  Gruß
                  Wodan

                  Comment


                  • #10
                    hier die lösung

                    ja klar mache ich doch.

                    so habe ich es nun gelöst:

                    PHP Code:
                    preg_match("#(<A\sHREF\s*=\s*\"([^\"]+)\"\s*ADD_DATE).*\">(.+)</a>#isu",$line,$match); 

                    gruss
                    gruss pedro

                    Comment

                    Working...
                    X