Regular Expression Links von href="" auslesen

  • Hallo,
    ich habe ein eigentlich funktionierendes Pattern geschrieben, welches mir jedoch in der Praxis Probleme bereitet.

    HTML
    <a.*href=(?:\"|\')(.*?)(?:\"|#|\'|mailto:).*>

    Hier sollte im Array eigentlich immer nur folgendes stehen:

    Leider sieht es bei mir zum Teil so aus:

    Demnach geht also der Link service/newsletter.html verloren, was sicherlich durch das Pattern .* hervorgerufen wird. Nur wie kann man das ändern?

    Vielen Dank

    -

  • Versuch mal folgendes Pattern:

    Code
    <a[^>]*href=(?:\"|\')([^>]*)(?:\"|#|\'|mailto:)[^>]*>

    Das hat zwar nun die Links drin, aber ich verstehe nicht was [^>] macht und es wird zudem oft noch mehr mitgenommen:

    Code
    [22] => Array
        (
            [0] => <a href="seite/einleitung.html" onfocus="blurLink(this);">
            [1] => seite/einleitung.html" onfocus="blurLink(this); <= overhead
    [26] => Array
        (
            [0] => <a class="mail" title="&Ouml;ffnet ein Fenster zum Versenden einer E-Mail" href="mailto:info@trest.de">
            [1] => mailto:info@trest.de <= mailto soll nicht rein

    Versuchs mal mit preg_match_all() und schau dir bei regex greedy/ungreedy an.

    Ich habe dazu nur das hier gefunden, womit ich was anfangen konnte:
    http://www.exampledepot.com/egs/java.util.regex/Greedy.html
    Mit

    Code
    <a.*href=(?:\"|\')(.*?)(?:\"|#|\'|mailto:).*?>


    geht es aber genausowenig.

    -

  • Dann zeig mal bitte den Rest deines Skriptes bzw. die Links O.o
    Hab das grad mal beim FH Quelltext probiert, und da geht es wunderbar ...

    PHP
    <?php
    $source = '<a href="kontakt/allgemein.html" onfocus="blurLink(this);">Kontakt</a>';
    preg_match_all('|<a\s+href=[\'\']([^\'\']*)[\'\']\s*>.*</a>|Ui', $source, $target, PREG_SET_ORDER);
    print_r($target);
    ?>

    Leeres Array... was macht das |Ui denn?

    -

  • Da auf mein Thread niemand so schlau antworten konnte, frag ich hier grad mal rein, da es zum Thema passt:

    Wie müsste das RegEx aussehen, wenn man NUR die Links ersetzen müsste (wenns ginge, irgendwie in einem Schritt per preg_replace(), oder so...).
    Das heisst so:

    <a href="?url=xyz">....

    nach so:

    <a href="http://www.xyz.yz/?hello=http://iuoi.com/?url=xyz">...

  • Meine Güte, ich kann heut irgendwie nicht mehr klar denken ~.+
    Sag bescheid, falls ich noch was vergessen habe ...

    Code
    |<a.*\s+href=[\'\']([^\'\']*)[\'\'].*>.*</a>|Ui

    Das U und das i am Schluss sind Modifikatoren.

    Vielen Dank für deine Hilfe. Ich würde noch gerne 2 Sachen mehr Filterm, weiß jedoch nicht, wie ich dies in der Regex ergänze.

    Code
    [8] => Array
            (
                [0] => <a href="#A.20">FAQ</a>
                [1] => #A.20
            )
    PHP
    <a.*\s+href=[\'\']([^\'\']*)[\'\'\#].*>.*</a>

    Erstellt jedoch noch die ganzen Arrays. Kann man dies verhindern?

    Code
    [22] => Array
            (
                [0] => <a class="mail" href="mailto:test@test.de"><img src="/img/mail.gif"/>per Email</a>
                [1] => mailto:test@test.de
            )
    PHP
    <a.*\s+href=[\'\']([^\'\']*)[\'\'mailto]:.*>.*</a>

    Geht so gruppenbedingt auch nicht.

    Da auf mein Thread niemand so schlau antworten konnte, frag ich hier grad mal rein, da es zum Thema passt:

    Wie müsste das RegEx aussehen, wenn man NUR die Links ersetzen müsste (wenns ginge, irgendwie in einem Schritt per preg_replace(), oder so...).
    Das heisst so:

    <a href="?url=xyz">....

    nach so:

    <a href="http://www.xyz.yz/?hello=http://iuoi.com/?url=xyz">...

    Du kannst get Parameter mit dem ? einleiten. Anschließend müssen die Parameter aber mit einem & getrennt werden.

    http://domain.de/index.php?param1=wert1&param2=wert2

    -

  • Ja das weiss ich auch, das sollte dann urlencodiert sein.. aber egal..
    Weisst du grad, wie man das realisieren könnte?

  • Hm, wie meinst du das genau, filtert er dir jetzt zu wenig, oder zu viel heraus ?
    Bzw. versteh ich das richtig, dass er jetzt alle Links bis auf mailto: filtern soll ?
    In dem Fall würde ich einfach das array einmal durchsuchen und alle mailto: rauszulöschen, sollte einfacher gehen, als das Rexex wieder umzuschreiben.

    Also ich habe das nun erstmal mit substr() gelöst und dann halt geguckt ob mailto: im Array steht. An der ersten Position steht.

    Konkret wollte ich nur wirkliche Links also kein mailto: oder #text Verweise und da wäre es für mich nun interessant wie man zumindest das mailto: hätte weglassen können, da es sich hierbei ja um mehre Buchstaben handelt und dies so in der Gruppe nicht einfach reingeschrieben werden kann.

    Danke

    -