Ich habe nach einem einfachen regulären Ausdruck für URLs gesucht. Hat jemand einen zur Hand, der gut funktioniert? Ich habe keine mit den Validierungsklassen des zend-Frameworks gefunden und mehrere Implementierungen gesehen.
php
regex
url
validation
AndreLiem
quelle
quelle
Antworten:
Ich habe dies bei einigen Projekten verwendet. Ich glaube nicht, dass ich auf Probleme gestoßen bin, aber ich bin sicher, dass es nicht erschöpfend ist:
Der größte Teil des zufälligen Mülls am Ende besteht darin, Situationen wie
http://domain.com.
in einem Satz zu behandeln (um zu vermeiden, dass die nachfolgende Periode übereinstimmt). Ich bin sicher, es könnte aufgeräumt werden, aber da es funktioniert hat. Ich habe es mehr oder weniger einfach von Projekt zu Projekt kopiert.quelle
google.com
ist nur ein gültiger relativer URL-Pfad, aber keine gültige absolute URL. Und ich denke, das ist es, wonach er sucht.http://example.com/somedir/...
ist eine absolut legitime URL, die nach der benannten Datei fragt...
- was ein legitimer Dateiname ist.http://www.example
als gültigVerwenden Sie die
filter_var()
Funktion, um zu überprüfen, ob eine Zeichenfolge eine URL ist oder nicht:Es ist eine schlechte Praxis, reguläre Ausdrücke zu verwenden, wenn dies nicht erforderlich ist.
EDIT : Seien Sie vorsichtig, diese Lösung ist nicht Unicode-sicher und nicht XSS-sicher. Wenn Sie eine komplexe Validierung benötigen, ist es vielleicht besser, woanders zu suchen.
quelle
http://www
Gemäß dem PHP-Handbuch sollte parse_url nicht zum Überprüfen einer URL verwendet werden.
Leider scheint das
filter_var('example.com', FILTER_VALIDATE_URL)
nicht besser zu funktionieren.Beide
parse_url()
undfilter_var()
übergeben fehlerhafte URLs wiehttp://...
Daher wird in diesem Fall - regex ist die bessere Methode.
quelle
Nur für den Fall, dass Sie wissen möchten, ob die URL wirklich existiert:
quelle
$url
bevor ich tatsächlich überprüfe, ob die URL echt ist, da der oben genannte Vorgang teuer ist - je nach Dateigröße vielleicht bis zu 200 Millisekunden. In einigen Fällen ist für die URL möglicherweise noch keine Ressource an ihrem Speicherort verfügbar (z. B. Erstellen einer URL für ein Bild, das noch hochgeladen werden muss). Außerdem verwenden Sie keine zwischengespeicherte Version, sodassfile_exists()
eine Statistik nicht in einer Datei zwischengespeichert und fast sofort zurückgegeben wird. Die von Ihnen bereitgestellte Lösung ist jedoch weiterhin nützlich. Warum nicht einfach benutzenfopen($url, 'r')
?Nach John Gruber (Daring Fireball):
Regex:
using in preg_match ():
Hier ist das erweiterte Regex-Muster (mit Kommentaren):
Weitere Informationen finden Sie unter: http://daringfireball.net/2010/07/improved_regex_for_matching_urls
quelle
Ich denke nicht, dass die Verwendung regulärer Ausdrücke in diesem Fall eine kluge Sache ist. Es ist unmöglich, alle Möglichkeiten zu nutzen, und selbst wenn Sie dies getan haben, besteht immer noch die Möglichkeit, dass die URL einfach nicht existiert.
Hier ist eine sehr einfache Möglichkeit, um zu testen, ob die URL tatsächlich vorhanden und lesbar ist:
(Wenn
preg_match
dies nicht der Fall ist, werden auch alle Dateinamen auf Ihrem Server überprüft.)quelle
Ich habe dieses mit gutem Erfolg verwendet - ich erinnere mich nicht, woher ich es habe
quelle
quelle
Und da ist deine Antwort =) Versuche es zu brechen, du kannst nicht !!!
quelle
Bearbeiten:
Wie die Inzidenz hervorhob, wurde dieser Code mit der Veröffentlichung von PHP 5.3.0 (30.06.2009) VERRINGERT und sollte entsprechend verwendet werden.
Nur meine zwei Cent, aber ich habe diese Funktion entwickelt und benutze sie seit einiger Zeit mit Erfolg. Es ist gut dokumentiert und getrennt, so dass Sie es leicht ändern können.
quelle
quelle
Inspiriert von dieser .NET StackOverflow-Frage und in diesem Artikel, auf den in dieser Frage verwiesen wird, gibt es diesen URI-Validator (URI bedeutet, dass sowohl URL als auch URN validiert werden).
Ich habe diese Funktion erfolgreich in einem von mir benannten
Uri
und getesteten ValueObject getestetUriTest
.UriTest.php (Enthält gültige und ungültige Fälle für URLs und URNs)
Uri.php (Wertobjekt)
UnitTests ausführen
Es gibt 65 Aussagen in 46 Tests. Achtung: Es gibt 2 Datenanbieter für gültige und 2 weitere für ungültige Ausdrücke. Eine ist für URLs und die andere für URNs. Wenn Sie eine Version von PhpUnit von Version 5.6 * oder früher verwenden, müssen Sie die beiden Datenanbieter zu einem einzigen verbinden.
Codeabdeckung
In diesem URI-Beispielprüfer ist die Codeabdeckung zu 100% vorhanden.
quelle
(http (s?): //) bedeutet http: // oder https: //
([a-z0-9 -] +.) + => 2,0 [a-z0-9-] bedeutet ein beliebiges Az-Zeichen oder ein 0-9- oder (-) Zeichen)
" /( http ( s?) : //) ([a- z0-9- lightboxes + ) / i "
Hinweis: Entschuldigung für schlechtes Englisch. Mein Land nutzt es nicht gut.
quelle
OK, das ist ein bisschen komplexer als ein einfacher Regex, aber es erlaubt verschiedene Arten von URLs.
Beispiele:
Alles, was als gültig markiert werden sollte.
Beachten Sie, dass für die Protokolle, die Sie zulassen möchten, eine In_array-Prüfung durchgeführt wird (derzeit befinden sich nur http und https in dieser Liste).
quelle
Die beste URL Regex, die für mich funktioniert hat:
Beispiele:
Quelle: http://urlregex.com/
quelle
Peters Regex sieht für mich aus vielen Gründen nicht richtig aus. Es erlaubt alle Arten von Sonderzeichen im Domain-Namen und testet nicht viel.
Frankies Funktion sieht für mich gut aus und Sie können aus den Komponenten einen guten regulären Ausdruck erstellen, wenn Sie keine Funktion möchten, wie folgt:
Ungetestet, aber ich denke, das sollte funktionieren.
Auch Owens Antwort sieht nicht 100% aus. Ich habe den Domain-Teil des Regex genommen und ihn mit einem Regex-Tester-Tool http://erik.eae.net/playground/regexp/regexp.html getestet
Ich setze die folgende Zeile:
im Abschnitt "Regexp" und in der folgenden Zeile:
unter dem Abschnitt "Beispieltext".
Das Ergebnis ließ das Minuszeichen durch. Weil \ S ein beliebiges Nicht-Leerzeichen bedeutet.
Beachten Sie, dass der reguläre Ausdruck von Frankie das Minus behandelt, da er diesen Teil für das erste Zeichen enthält:
Was das Minuszeichen oder ein anderes Sonderzeichen nicht zulässt.
quelle
Hier ist, wie ich es gemacht habe. Aber ich möchte erwähnen, dass ich in Bezug auf die Regex nicht so sicher bin. Aber es sollte funktionieren du :)
Auf diese Weise benötigen Sie den Bewertungsmarker nicht auf Ihrem Muster.
Ich hoffe es hilft :)
quelle
Hier ist eine einfache Klasse für die URL-Validierung mit RegEx, in der die Domain mit gängigen RBL-Servern (Realtime Blackhole Lists) verglichen wird:
Installieren:
Verwendung:
Fügen Sie eine URL als Parameter der
domain()
Methode hinzu und überprüfen Sie die Rückgabe.Ausgabe:
Wie Sie oben sehen können, wird www.bokranzr.com über eine RBL als schädliche Website aufgeführt, sodass die Domain als falsch zurückgegeben wurde.
quelle
Für alle, die mit WordPress entwickeln, verwenden Sie einfach
um eine URL zu validieren ( hier ist die Dokumentation von WordPress zu
esc_url_raw
). Er verarbeitet URLs viel besser als ,filter_var($url, FILTER_VALIDATE_URL)
weil es ist Unicode und XSS-Safe. ( Hier ist ein guter Artikel, in dem alle Probleme mit erwähnt werdenfilter_var
).quelle
Ich habe festgestellt, dass dies am nützlichsten ist, um eine URL abzugleichen.
quelle
ftp:
?Dafür gibt es eine native PHP-Funktion:
Gibt die gefilterten Daten zurück oder FALSE, wenn der Filter fehlschlägt.
Überprüfen Sie es hier
quelle