2009-07-02 19 views
2

Ich habe mich selbst versucht und online gesucht, diesen regulären Ausdruck zu schreiben, aber ohne Erfolg.Spezifische Domain-URL-Validierung mit regulärem Ausdruck

Ich muss validieren, dass eine bestimmte URL aus einer bestimmten Domäne und einem wohlgeformten Link (in PHP) stammt. Zum Beispiel:

Gute Domain: example.com

So gut URLs von example.com:

So schlecht URLs nicht von example.com:

Einige Hinweise: ich kümmern sich nicht um "http" verus "https", aber wenn es Ihnen wichtig ist, nehmen Sie "http" immer an Der Code, der diese Regex verwendet, ist PHP, also Extrapunkte für Das.

UPDATE 2010:

Gruber fügt eine große URL Regex:

?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’])) 

Siehe seinen Beitrag: An Improved Liberal, Accurate Regex Pattern for Matching URLs

+0

Ihr "Good Domain" -Beispiel ist ** nicht ** eine gültige URL (fehlender Pfad). –

+0

@Nikolar Ruhe: Der Pfad ist optional: "http: //" Hostport ["/" hpath ["?" Suche]] (siehe RFC 1738) – Gumbo

+0

Dies ist keine gültige URL, sondern gibt die gültige Domain an, die von den Beispiel-URLs verwendet wird, aber vielleicht sollte ich einfach 'blah.com' sagen und nicht mehr. So oder so, ich denke, der Punkt ist gemacht. – donohoe

Antwort

5

Mein Stab an sie

Vielleicht
<?php 

$pattern = "#^https?://([a-z0-9-]+\.)*blah\.com(/.*)?$#"; 

$tests = array(
    'http://blah.com/so/this/is/good' 
    , 'http://blah.com/so/this/is/good/index.html' 
    , 'http://www.blah.com/so/this/is/good/mice.html#anchortag' 
    , 'http://anysubdomain.blah.com/so/this/is/good/wow.php' 
    , 'http://anysubdomain.blah.com/so/this/is/good/wow.php?search=doozy' 
    , 'http://any.sub-domain.blah.com/so/this/is/good/wow.php?search=doozy' // I added this case 
    , 'http://999.sub-domain.blah.com/so/this/is/good/wow.php?search=doozy' // I added this case 
    , 'http://obviousexample.com' 
    , 'http://bbc.co.uk/blah.com/whatever/you/get/the/idea' 
    , 'http://blah.com.example' 
    , 'not/even/a/blah.com/url' 
); 

foreach ($tests as $test) 
{ 
    if (preg_match($pattern, $test)) 
    { 
    echo $test, " <strong>matched!</strong><br>"; 
    } else { 
    echo $test, " <strong>did not match.</strong><br>"; 
    } 
} 

// Here's another way 
echo '<hr>'; 
foreach ($tests as $test) 
{ 
    if ($filtered = filter_var($test, FILTER_VALIDATE_URL)) 
    { 
    $host = parse_url($filtered, PHP_URL_HOST); 
    if ($host && preg_match("/blah\.com$/", $host)) 
    { 
     echo $filtered, " <strong>matched!</strong><br>"; 
    } else { 
     echo $filtered, " <strong>did not match.</strong><br>"; 
    } 
    } else { 
    echo $test, " <strong>did not match.</strong><br>"; 
    } 
} 
+0

Die Dokumentation für die ' parse_url' Funktion besagt, dass es nicht zur Validierung von URLs gedacht ist: Ungültige URLs können immer noch analysiert werden. Sie brauchen also zusätzliche Prüfungen. –

+0

Oh, ich stimme zu - es muss wahrscheinlich strenger getestet werden. Trotzdem funktioniert meine Regex-Lösung genauso gut. –

+0

Ich habe die Logik Ihres Beitrags in meinen 2. Algo übernommen. Scheint gut zu funktionieren! –

0
\b(https?)://([-A-Z0-9]+\.)*blah.com(/[-A-Z0-9+&@#/%=~_|!:,.;]*)?(\?[A-Z0-9+&@#/%=~_|!:,.;]*)? 
+0

Ich denke, dass http http://blah.com.evil.domain erlauben würde (unter der Annahme, dass die AZ ist A-Za-z) –

+0

Kommentar-System von der http- entfernt: von meinem vorherigen Beispiel ... –

0
!^https?://(?:[a-zA-Z0-9-]+\.)*blah\.com(?:/[^#]*(?:#[^#]+)?)?$! 
1

:

^https?://[^/]*blah\.com(|/.*)$ 

Edit:

Schützen gegen http://editblah.com

^https?://(([^/]*\.)|)blah\.com(|/.*)$ 
+0

Schließen! Aber das würde eine Domain wie fooblah.com falsch positiv machen –

7

Müssen Sie einen regulären Ausdruck verwenden? PHP hat viele eingebaute Funktionen für solche Dinge.

filter_var($url, FILTER_VALIDATE_URL) 

wird Ihnen sagen, wenn eine URL gültig ist, und

$domain = parse_url($url, PHP_URL_HOST); 

wird Ihnen die Domain es bezieht.

Es könnte klarer und aufrechterhaltbar als einige tolle Regex sein.

Verwandte Themen