Frage

Ich habe ein Skript, das URLs aus verschiedenen Quellen, was zu einer ziemlich großen Liste Schaben. Zur Zeit habe ich nur eine Sammlung von if-Anweisungen, dass ich mit Websites, um herauszufiltern will ich nicht. Dies ist offensichtlich nicht verwaltbar, so versuche ich, zum Filtern gegen eine schwarze Liste von URL-Masken eine schnelle und leistungsfähige Lösung zu finden.

Das Beste, was ich tun konnte, wird durch eine Reihe von regex Muster Looping und alles, was das Filtern, die übereinstimmt. Ist das wirklich meine beste Wette oder gibt es eine andere Methode, die den Job besser tun würde?

War es hilfreich?

Lösung

Wenn Sie Domainnamen ausschließen mögen, oder eine URL, die keinen „variable Teil“ hat, könnte eine Lösung sein, um eine Datenbank zu verwenden, mit einer Tabelle nur die URL, mit dem rechten Index enthält, und ein schnelles Spiel zu tun.

Herauszufinden, ob eine URL nicht mit wäre dann nur noch eine Frage oder Sie eine schnelle Abfrage dieser DB (die in der Regel bedeutet „URL gleich“ oder „URL beginnt mit“) behandelt werden muß -., die so einfach wie eine SQLite DB sein kann, die in einer Datei passt und keine zusaetzliche Server erforderlich


Die Idee eines PHP-Array hat einen Nachteil: wenn Ihr Array immer größer wird, wird es mehr und mehr Speicher nehmen es einfach in Erinnerung zu haben - und einen Tag oder eine andere, werden Sie zu viel Speicherplatz verbrauchen und treffen wird memory_limit; wenn Sie mehr als ein paar tausend URLs haben, könnte diese Lösung nicht die beste sein.

Dennoch, wenn Sie nur ein paar URLs oder Muster haben, die Idee eines PHP-Array, über das Looping und jeder Wert mit strpos Vergleich (für „enthält“ oder „beginnt mit“) oder preg_match (für reguläre Ausdrücke) wird -. und ist die am einfachsten zu implementieren


Wenn Sie einige komplexe passende Regel verwenden möchten, eine Art von Regex wahrscheinlich die einzige reale Möglichkeit sein ... Ob auf der PHP-Seite, mit preg_match oder auf einem SQL-Server (MySQL, zum Beispiel, hat die Unterstützung für regex soweit ich weiß - keine Ahnung von den Leistungen, obwohl, siehe 11.4.2. Reguläre Ausdrücke für weitere Informationen)

Andere Tipps

Sie sollten die Websites in einem Hash halten und so nachschlagen. es ist einfach und elegant:

    $excluded['www.google.com'] = true;
    $excluded['www.mapquest.com'] = true;
    $excluded['www.yahoo.com'] = true;

    $url = "http://www.google.com?q=barefoot+winery";

    $urlArray = parse_url($url)

    if (! isset($excluded[$urlArray['host']]))
    {
        scrape($url)
    }

Als pascal nach einer Weile gesagt werden Sie in den Speicher Probleme stoßen. Aber an diesem Punkt die Urls Aufrechterhaltung wird ein größeres Problem sein. Gehen Sie für eine Datenbank, wenn das passiert.

Wenn Sie müssen in der Lage sein Muster zu spezifizieren, dann durch eine Reihe von regulären Ausdrücken Looping ist wahrscheinlich in Ordnung.

Wenn Sie nur exakte Übereinstimmungen und keine Muster sehen müssen, können Sie strpos verwenden oder so zu tun, nur ein gerade Schnur Spiel, das etwas schneller sein sollte.

Wollen Sie eine lange Liste von Elementen in den Speicher jedes Mal geladen? Ich denke, egrep oder grep wird beste Methode sein. Auf Linux-Dateien werden in der Datei-Cache bleiben und die Ergebnisse werden sehr schnell und da egrep durch Datei ausgeführt wird, nicht jeder Apache-Thread wird die Kopie der Liste im Speicher hat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top