Bestimmte Links mit preg_match_all() sammeln

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Bestimmte Links mit preg_match_all() sammeln

    Hallo,

    ich will aus einer Webseite bestimmte Links sammeln.

    Der Aufbau ist immer gleich:

    <a href="1494761,anzeige-mercedes-gebraucht.html">

    Der Teil nach "anzeige" variiert je nach gesuchten Auto.

    Das liefert mir zwar alle Links aber eben ohne den hinteren Teil:

    Code:
    preg_match_all('/((\d{7}),anzeige\-)/s',$inhalt,$results);
    Theoretisch müßte doch das hier funktioneren, tut es aber nicht?

    Code:
    preg_match_all('/((\d{7}).*html)/s',$inhalt,$results);
    Irgendwelche Tipps? Bin langsam ratlos

    Bei dem Tester von regexe.de funktionert es, allerdings verwende ich ja preg_match_all() und nicht preg_match().

    Danke,
    NBG

  • #2
    Meine besten regexp-Zeiten habe ich mangels Möglichkeiten zwar hinter mir, das hier funktioniert.
    PHP-Code:
    preg_match_all('/((\d{7}),anzeige\-)([a-z]{1,})\-([a-z]{1,})/s',$inhalt,$results); 
    Oder
    PHP-Code:
    preg_match_all('/(([0-9]{7}).*?html)/s',$str,$results); 
    Ob beide Lösungen performant sind, kann ich leider nicht sagen. Dazu habe ich zu lange nicht mehr mit regexps zu tun gehabt.

    Peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Zitat von Truncate Beitrag anzeigen
      Hallo,

      ich will aus einer Webseite bestimmte Links sammeln.

      Der Aufbau ist immer gleich:

      <a href="1494761,anzeige-mercedes-gebraucht.html">

      Der Teil nach "anzeige" variiert je nach gesuchten Auto.

      Das liefert mir zwar alle Links aber eben ohne den hinteren Teil:

      Code:
      preg_match_all('/((\d{7}),anzeige\-)/s',$inhalt,$results);
      Theoretisch müßte doch das hier funktioneren, tut es aber nicht?

      Code:
      preg_match_all('/((\d{7}).*html)/s',$inhalt,$results);
      Irgendwelche Tipps? Bin langsam ratlos
      "..., tut es aber nicht" ist keine vernünftige Fehlerbeschreibung.

      Vermutlich bist du der Gier (des RegEx') zum Opfer gefallen. ".*html" findet den längstmöglichen String, der auf das Muster Beliebiges-Zeichen-beliebig-oft-mit-html-am-Ende passt. Ein einfaches Fragezeichen nach dem Quantifizierer (hier das "*"), kehrt den Effekt um und macht den Regex "faul" und für deine Aufgabe geeigneter:

      PHP-Code:
      '/.*?html/' 
      Bei dem Tester von regexe.de funktionert es, ...
      Das tut es mit großer Wahrscheinlichkeit nicht. Vermutlich hast du andere Test-Daten verfüttert, also keine mehrfach vorkommenden Links.

      ... allerdings verwende ich ja preg_match_all() und nicht preg_match().
      Preg_match_all() unterscheidet sich in seiner grundlegenden Arbeitsweise nicht von preg_match(), welches man in einer Schleife mehrfach aufruft.
      Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

      Kommentar

      Lädt...
      X