2017-03-03 5 views
4

Ich suche nach einer Regex, die nur mit gültigen, nur online URLs übereinstimmt.PHP Regex, die nur mit regulären, gültigen URLs übereinstimmt

Zum Beispiel:

exmaple.com 
http://exmaple.com 
https://exmaple.com 
www.exmaple.com 
http://www.example.com 
https://www.example.com 

und speziellen Bereich und Erweiterungen wie:

t.co 
example.deals 
sh.party 

Und so weiter, aber alle die komplizierten Sachen wie ftp nicht übereinstimmen, get Abfragen oder URLs wie 2.3.3.1 .

Ich habe '#(www\.|https?://)?[a-z0-9]+\.[a-z0-9]{2,4}\S*#i' benutzen, aber es erkennt Daten, zum Beispiel 3.3.2017.

Ich brauche dies weil ich get_headers zu jedem gefundenen URL anwenden, und wenn ich get_headers für ungültige URLs wie ein Datum zu tun, die ich erhalten:

get_headers(http://03.03.2017): failed to open stream: Connection timed out

TL; DR: Ich suche für eine Regex, die nur URLs entspricht, die Sie anwenden können get_headers() auf.

Vielen Dank für Ihre Hilfe!

+0

Gibt es Top-Level-Domains mit Nummern? Und "Geschäfte" hat fünf chrs. – JosefScript

+0

@JosefScript sieht aus als ob es kein Problem mit Domains wie '12345.com' gibt, obwohl ich mir ziemlich sicher bin, dass es nicht nur eine numerische Erweiterung gibt. –

+0

Eine Regex kann keine Online-URL angeben, sie kann nur einem Muster entsprechen. Das Muster einer Domain anzupassen, wird auch schwierig sein, ist 'chris.inc' ein Firmenname oder eine Domain? – chris85

Antwort

2

Ich würde sagen Regex ist nicht die beste Lösung für die Überprüfung gültiger URL. Es wäre besser, FILTER_VALIDATE_URL zu verwenden:

<?php 
$url = "https://www.w3schools.com"; 

if (!filter_var($url, FILTER_VALIDATE_URL) === false) { 
    echo("$url is a valid URL"); 
} else { 
    echo("$url is not a valid URL"); 
} 
?> 
+0

'http: // 23.2017' bestand diesen Test. –

+0

Wenn es sich um eine IP-Adresse handelt, können Sie mit FILTER_VALIDATE_IP validieren. Mit beiden können Sie Ihr Problem lösen. – fabionvs

+0

nicht genau, '23.2017' ist keine IP, da 2017 größer als 255 ist. In meinem Code muss ich nur URLs erkennen, denn wenn man 'get_headers()' etwas anderes gibt, ist die Verbindung mal aus und die Webseite ist nicht mehr erreichbar. –

1
#(https?:\/\/)?([a-z0-9_~-]+\.)+[a-z]{2,5}(\/\S*)?#i 

EDIT: Dritter Versuch: Optional http oder https am Anfang. Danach folgen mindestens ein Domain-Name und ein Punkt, dann eine Top-Level-Domain mit 2-5 Buchstaben und optional ein Tail eines Backslashs sowie zusätzliche Nicht-Leerzeichen.

+0

Sieht gut aus, aber die Regex akzeptiert URLs wie' example.com:) ', was ein Problem für 'get_headers', da diese URL ungültig ist. –

+0

Ich suche nach etwas ähnlich dem, was [LinkifyJS] (http://soapbox.github.io/linkifyjs/) tut, aber in PHP. Ich konnte seine Regex nicht aus dem Quellcode finden. –

Verwandte Themen