preg_match_all timeout ;(

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

  • preg_match_all timeout ;(

    Hallo,

    ich habe ein kleines Problem. Leider bekomme ich bei meinem preg_match_all bei größeren Datenmengen immer ein timeout.

    Mein Server läuft im Save-Modus und auch die PHP Ini möchte ich aus bestimmten Gründen nicht ändern.

    Kann mir nun jemand sagen, ob man diesen Fehler abfangen kann, bzw. ob man die Datenmenge vorher prüfen kann, damit es nicht zu diesem Fehler kommt?

    Lieben Gruss

    Bastian

    PS: Der Befehl soll Links aus einer Seite auslesen:
    preg_match_all("/<a (?:s*)href(?:s*)=(?:s*)(?:\"|\')(?:.*)(https?:\/\/.*)(?:\"|\')(?:.*)>(?:.*)<\/a>/isU",$content,$hrefs);

  • #2
    Du suchst also alle externen Links in $content samt weiteren Attributen und Link-Text.

    Ich würde damit anfangen, die optionalen Sub-Patterns anders aufzubauen (und die reinen Blank-Patterns aus den Klammern zu nehmen).
    Außerdem ist (?:.*) doppelt optional ... (.*) reicht vollkommen aus.
    Zusätzlich habe ich noch den Delimiter geändert; dann kann man sich die Backslashes vor den Slashes sparen.

    preg_match_all("%<a\s+href\s+=\s+(\"|\')?(https?\://.*)\1(.*)>(.*)</a>%isU", $content, $hrefs);

    Sub-Patterns:
    $1: Anführungszeichen
    den (.*) vor der URL habe ich mal entfernt
    $2: URL
    $3: weitere Tag-Attribute
    $4: Link-Beschreibung

    bisher:
    $1: blanks
    $2: blanks
    $3: blanks
    $4: Anführungszeichen
    $5: alles vor 'http(s)'
    $6: URL
    $7: Anführungszeichen
    $8: weitere Tag-Attribute
    $9: Link-Beschreibung


    Was eventuell noch Sinn macht, ist die Abfrage von usernameassword@ vor der URL, aber wenn man die direkt auf eine HTML-Seite schreibt, kann man den Zugang zur Seite auch gleich offen lassen.

    preg_match_all("%<a\s+href\s+=\s+(\"|\')?((\w+)(\.*))?@)?(https?\://.*)\1(.*)>(.*)</a>%isU", $content, $hrefs);

    Sub-Patterns:
    $1: Anführungszeichen
    $3: Username
    $5: Passwort
    $6: URL
    $7: weitere Tag-Attribute
    $8: Link-Beschreibung
    mein Sport: mein Frühstück: meine Arbeit:

    Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

    Kommentar


    • #3
      Erstmal vielen lieben Dank für Deine Antwort.

      Mir ist aufgefallen, dass ich den Link-Text gar nicht mehr brauche War mal vorgesehen. Würde das das ganze noch weiter verschlanken?

      Gruss

      Bastian

      Kommentar


      • #4
        Fehler tritt immer noch auf

        Hallo,

        ich habe die neue Code Zeile gerade ausprobiert. Leider tritt der Timeout Fehler immer noch auf.

        Ich finde es sowieso merkwürdig, dass ein preg_match einen Timeoutfehler verursacht ...

        Gruss

        Basti

        Kommentar


        • #5
          wenn du die sonstigen Attribute auch nicht brauchst:

          "%href\s+=\s+(\"|')?(https?\://.*)\1%Ui"
          $1: Anführungszeichen
          $2: URL

          Der Modífier s ist jetzt überflüssig, da Zeilenumbrüche in \s sowieso enthalten sind und im href-Attribut keine vorkommen dürfen/sollten.
          mein Sport: mein Frühstück: meine Arbeit:

          Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

          Kommentar

          Lädt...
          X