regex - ما أفضل تعبير عادي للتحقق مما إذا كانت السلسلة عبارة عن عنوان URL صالح؟




language-agnostic (25)

كيف يمكنني التحقق مما إذا كانت السلسلة المعينة هي عنوان URL صالح؟

إن معرفتي بالتعبيرات العادية أساسية ولا تسمح لي بالاختيار من بين مئات التعبيرات العادية التي رأيتها بالفعل على الويب.


Answers

إذا كنت تبحث حقًا عن المطابقة النهائية ، فربما تجدها في " تعبير Url Regular عادي " ؟

ولكن تعبيرًا متطابقًا يتطابق حقًا مع جميع النطاقات المحتملة ويسمح بأي شيء مسموح به وفقًا لمواد RFC فهو طويل جدًا وغير قابل للقراءة ، ثق بي ؛-)


إليك ما يستخدمه RegexBuddy .

(\b(https?|ftp|file)://)?[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]

يطابق هذه أدناه (داخل ** ** علامات):

**http://www.regexbuddy.com**  
**http://www.regexbuddy.com/**  
**http://www.regexbuddy.com/index.html**  
**http://www.regexbuddy.com/index.html?source=library**  

يمكنك تنزيل RegexBuddy على http://www.regexbuddy.com/download.html .


The following RegEx will work:

"@((((ht)|(f))tp[s]?://)|(www\.))([a-z][-a-z0-9]+\.)?([a-z][-a-z0-9]+\.)?[a-z][-a-z0-9]+\.[a-z]+[/]?[a-z0-9._\/~#&=;%+?-]*@si"

Here's a ready-to-go Java version from the Android source code. This is the best one I've found.

public static final Matcher WEB  = Pattern.compile(new StringBuilder()                 
.append("((?:(http|https|Http|Https|rtsp|Rtsp):")                      
.append("\\/\\/(?:(?:[a-zA-Z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)")                         
.append("\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,64}(?:\\:(?:[a-zA-Z0-9\\$\\-\\_")                         
.append("\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,25})?\\@)?)?")                         
.append("((?:(?:[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}\\.)+")   // named host                            
.append("(?:")   // plus top level domain                         
.append("(?:aero|arpa|asia|a[cdefgilmnoqrstuwxz])")                         
.append("|(?:biz|b[abdefghijmnorstvwyz])")                         
.append("|(?:cat|com|coop|c[acdfghiklmnoruvxyz])")                         
.append("|d[ejkmoz]")                         
.append("|(?:edu|e[cegrstu])")                         
.append("|f[ijkmor]")                         
.append("|(?:gov|g[abdefghilmnpqrstuwy])")                         
.append("|h[kmnrtu]")                         
.append("|(?:info|int|i[delmnoqrst])")                         
.append("|(?:jobs|j[emop])")                         
.append("|k[eghimnrwyz]")                         
.append("|l[abcikrstuvy]")                         
.append("|(?:mil|mobi|museum|m[acdghklmnopqrstuvwxyz])")                         
.append("|(?:name|net|n[acefgilopruz])")                         
.append("|(?:org|om)")                         
.append("|(?:pro|p[aefghklmnrstwy])")                         
.append("|qa")                         
.append("|r[eouw]")                         
.append("|s[abcdeghijklmnortuvyz]")                         
.append("|(?:tel|travel|t[cdfghjklmnoprtvwz])")                         
.append("|u[agkmsyz]")                         
.append("|v[aceginu]")                         
.append("|w[fs]")                         
.append("|y[etu]")                         
.append("|z[amw]))")                         
.append("|(?:(?:25[0-5]|2[0-4]") // or ip address                                                 
.append("[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.(?:25[0-5]|2[0-4][0-9]")                             
.append("|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1]")                         
.append("[0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}")                         
.append("|[1-9][0-9]|[0-9])))")                         
.append("(?:\\:\\d{1,5})?)") // plus option port number                             
.append("(\\/(?:(?:[a-zA-Z0-9\\;\\/\\?\\:\\@\\&\\=\\#\\~")  // plus option query params                         
.append("\\-\\.\\+\\!\\*\\'\\(\\)\\,\\_])|(?:\\%[a-fA-F0-9]{2}))*)?")                         
.append("(?:\\b|$)").toString()                 
).matcher("");

أستخدم هذا التعبير العادي:

((https?:)?//)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)[email protected])?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63}(:[\d]+)?(/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?

لدعم كلا:

http://.com
https://.com

و:

//.com

This is a rather old thread now and the question asks for a regex based URL validator. I ran into the thread whilst looking for precisely the same thing. While it may well be possible to write a really comprehensive regex to validate URLs I eventually settled on another way to do things - by using PHP's parse_url function.

It returns boolean false if the url cannot be parsed. Otherwise it returns the scheme, the host and other information. This may well not be enough for a comprehensive URL check on its own but can be drilled down into for further analysis. If the intent is to simply catch typos, invalid schemes etc it is perfectly adequate.


        function validateURL(textval) {
            var urlregex = new RegExp(
            "^(http|https|ftp)\://([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&%\$\-]+)*@)*((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|localhost|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\?\'\\\+&%\$#\=~_\-]+))*$");
            return urlregex.test(textval);
        }

المباريات http://site.com/dir/file.php?var=moo | ftp://user:[email protected]:21/file/dir

غير المطابق site.com | http://site.com/dir//


This one works for me very well. (https?|ftp)://(www\d?|[a-zA-Z0-9]+)?\.[a-zA-Z0-9-]+(\:|\.)([a-zA-Z0-9.]+|(\d+)?)([/?:].*)?


I tried to formulate my version of url. My requirement was to capture instances in a String where possible url can be cse.uom.ac.mu - noting that it is not preceded by http nor www

String regularExpression = "((((ht{2}ps?://)?)((w{3}\\.)?))?)[^.&&[a-zA-Z0-9]][a-zA-Z0-9.-]+[^.&&[a-zA-Z0-9]](\\.[a-zA-Z]{2,3})";

assertTrue("www.google.com".matches(regularExpression));
assertTrue("www.google.co.uk".matches(regularExpression));
assertTrue("http://www.google.com".matches(regularExpression));
assertTrue("http://www.google.co.uk".matches(regularExpression));
assertTrue("https://www.google.com".matches(regularExpression));
assertTrue("https://www.google.co.uk".matches(regularExpression));
assertTrue("google.com".matches(regularExpression));
assertTrue("google.co.uk".matches(regularExpression));
assertTrue("google.mu".matches(regularExpression));
assertTrue("mes.intnet.mu".matches(regularExpression));
assertTrue("cse.uom.ac.mu".matches(regularExpression));

//cannot contain 2 '.' after www
assertFalse("www..dr.google".matches(regularExpression));

//cannot contain 2 '.' just before com
assertFalse("www.dr.google..com".matches(regularExpression));

// to test case where url www must be followed with a '.'
assertFalse("www:google.com".matches(regularExpression));

// to test case where url www must be followed with a '.'
//assertFalse("http://wwwe.google.com".matches(regularExpression));

// to test case where www must be preceded with a '.'
assertFalse("https://[email protected]".matches(regularExpression));

لقد كتبت للتو مشاركة مدونة للحصول على حل رائع للتعرف على عناوين URL بالتنسيقات الأكثر استخدامًا مثل:

التعبير العادي المستخدم هو:

/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w][email protected])?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w][email protected])[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/

ومع ذلك ، أود أن أوصيك بالانتقال إلى http://blog.mattheworiordan.com/post/13174566389/url-regular-expression-for-links-with-or-without-the لمشاهدة كيفية العمل.


To Check URL regex would be:

^http(s{0,1})://[a-zA-Z0-9_/\\-\\.]+\\.([A-Za-z/]{2,5})[a-zA-Z0-9_/\\&\\?\\=\\-\\.\\~\\%]*

قد لا يكون هذا عملًا للتعبير المنطقي ، ولكن للأدوات الموجودة بلغتك المفضلة. ربما تريد استخدام التعليمة البرمجية الموجودة بالفعل التي تم كتابتها واختبارها وتصحيحها.

في PHP ، استخدم وظيفة parse_url .

بيرل: وحدة URI .

روبي: وحدة URI .

.NET: فئة "Uri"

لا يعد regexes عصا سحرية أنت موجة في كل مشكلة يحدث أن تنطوي على سلاسل.


For Python, this is the actual URL validating regex used in Django 1.5.1:

import re
regex = re.compile(
        r'^(?:http|ftp)s?://'  # http:// or https://
        r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|'  # domain...
        r'localhost|'  # localhost...
        r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|'  # ...or ipv4
        r'\[?[A-F0-9]*:[A-F0-9:]+\]?)'  # ...or ipv6
        r'(?::\d+)?'  # optional port
        r'(?:/?|[/?]\S+)$', re.IGNORECASE)

This does both ipv4 and ipv6 addresses as well as ports and GET parameters.

Found in the code here , Line 44.


فيما يتعلق الجفن 'الرد على الرسالة التي تقرأ "هذا يعتمد على قراءتي للمواصفات URI.": بفضل Eyelidness ، لك الحل الأمثل سعيت ، لأنه يستند إلى المواصفات URI! عمل رائع. :)

كان علي أن أدخل تعديلين. أول من يحصل على التعبير العادي لمطابقة عناوين URL لعنوان IP بشكل صحيح في PHP (v5.2.10) مع وظيفة preg_match ().

اضطررت إلى إضافة مجموعة أخرى من الأقواس إلى السطر أعلاه "عنوان IP" حول الأنابيب:

)|((\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])\.){3}(?#

غير متأكد من السبب.

لقد قمت أيضًا بخفض الحد الأدنى لطول نطاق المستوى الأعلى من 3 أحرف إلى حرفين لدعم .co.uk وما شابه.

الكود النهائي:

/^(https?|ftp):\/\/(?#                                      protocol
)(([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+(?#         username
)(:([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+)?(?#      password
)@)?(?#                                                     auth requires @
)((([a-z0-9]\.|[a-z0-9][a-z0-9-]*[a-z0-9]\.)*(?#             domain segments AND
)[a-z][a-z0-9-]*[a-z0-9](?#                                 top level domain  OR
)|((\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])\.){3}(?#
    )(\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])(?#             IP address
))(:\d+)?(?#                                                port
))(((\/+([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)*(?# path
)(\?([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)(?#      query string
)?)?)?(?#                                                   path and query string optional
)(#([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)?(?#      fragment
)$/i

لم يتم التحقق من هذه النسخة المعدلة مقابل مواصفات URI حتى لا أضمن توافقها ، فقد تم تعديلها للتعامل مع عناوين URL على بيئات الشبكات المحلية ونطاقي TLD بالإضافة إلى أنواع أخرى من عنوان URL على الويب ، والعمل بشكل أفضل في PHP الإعداد أستخدم.

كرمز PHP :

define('URL_FORMAT', 
'/^(https?):\/\/'.                                         // protocol
'(([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+'.         // username
'(:([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+)?'.      // password
'@)?(?#'.                                                  // auth requires @
')((([a-z0-9]\.|[a-z0-9][a-z0-9-]*[a-z0-9]\.)*'.                      // domain segments AND
'[a-z][a-z0-9-]*[a-z0-9]'.                                 // top level domain  OR
'|((\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])\.){3}'.
'(\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])'.                 // IP address
')(:\d+)?'.                                                // port
')(((\/+([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)*'. // path
'(\?([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)'.      // query string
'?)?)?'.                                                   // path and query string optional
'(#([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)?'.      // fragment
'$/i');

في ما يلي برنامج اختبار في PHP يثبت مجموعة متنوعة من عناوين URL باستخدام التعبير المعتاد:

<?php

define('URL_FORMAT',
'/^(https?):\/\/'.                                         // protocol
'(([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+'.         // username
'(:([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+)?'.      // password
'@)?(?#'.                                                  // auth requires @
')((([a-z0-9]\.|[a-z0-9][a-z0-9-]*[a-z0-9]\.)*'.                      // domain segments AND
'[a-z][a-z0-9-]*[a-z0-9]'.                                 // top level domain  OR
'|((\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])\.){3}'.
'(\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])'.                 // IP address
')(:\d+)?'.                                                // port
')(((\/+([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)*'. // path
'(\?([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)'.      // query string
'?)?)?'.                                                   // path and query string optional
'(#([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)?'.      // fragment
'$/i');

/**
 * Verify the syntax of the given URL. 
 * 
 * @access public
 * @param $url The URL to verify.
 * @return boolean
 */
function is_valid_url($url) {
  if (str_starts_with(strtolower($url), 'http://localhost')) {
    return true;
  }
  return preg_match(URL_FORMAT, $url);
}


/**
 * String starts with something
 * 
 * This function will return true only if input string starts with
 * niddle
 * 
 * @param string $string Input string
 * @param string $niddle Needle string
 * @return boolean
 */
function str_starts_with($string, $niddle) {
      return substr($string, 0, strlen($niddle)) == $niddle;
}


/**
 * Test a URL for validity and count results.
 * @param url url
 * @param expected expected result (true or false)
 */

$numtests = 0;
$passed = 0;

function test_url($url, $expected) {
  global $numtests, $passed;
  $numtests++;
  $valid = is_valid_url($url);
  echo "URL Valid?: " . ($valid?"yes":"no") . " for URL: $url. Expected: ".($expected?"yes":"no").". ";
  if($valid == $expected) {
    echo "PASS\n"; $passed++;
  } else {
    echo "FAIL\n";
  }
}

echo "URL Tests:\n\n";

test_url("http://localserver/projects/public/assets/javascript/widgets/UserBoxMenu/widget.css", true);
test_url("http://www.google.com", true);
test_url("http://www.google.co.uk/projects/my%20folder/test.php", true);
test_url("https://myserver.localdomain", true);
test_url("http://192.168.1.120/projects/index.php", true);
test_url("http://192.168.1.1/projects/index.php", true);
test_url("http://projectpier-server.localdomain/projects/public/assets/javascript/widgets/UserBoxMenu/widget.css", true);
test_url("https://2.4.168.19/project-pier?c=test&a=b", true);
test_url("https://localhost/a/b/c/test.php?c=controller&arg1=20&arg2=20", true);
test_url("http://user:[email protected]/a/b/c/test.php?c=controller&arg1=20&arg2=20", true);

echo "\n$passed out of $numtests tests passed.\n\n";

?>

شكرا مرة أخرى ل eyelidness ل regex!


ما المنصة؟ في حالة استخدام .NET ، استخدم System.Uri.TryCreate ، وليس regex.

فمثلا:

static bool IsValidUrl(string urlString)
{
    Uri uri;
    return Uri.TryCreate(urlString, UriKind.Absolute, out uri)
        && (uri.Scheme == Uri.UriSchemeHttp
         || uri.Scheme == Uri.UriSchemeHttps
         || uri.Scheme == Uri.UriSchemeFtp
         || uri.Scheme == Uri.UriSchemeMailto
            /*...*/);
}

// In test fixture...

[Test]
void IsValidUrl_Test()
{
    Assert.True(IsValidUrl("http://www.example.com"));
    Assert.False(IsValidUrl("javascript:alert('xss')"));
    Assert.False(IsValidUrl(""));
    Assert.False(IsValidUrl(null));
}

(بفضل @Yoshi للحصول على معلومات حول javascript: @Yoshi



You don't specify which language you're using. If PHP is, there is a native function for that:

$url = 'http://www.yoururl.co.uk/sub1/sub2/?param=1&param2/';

if ( ! filter_var( $url, FILTER_VALIDATE_URL ) ) {
    // Wrong
}
else {
    // Valid
}

Returns the filtered data, or FALSE if the filter fails.

Check it here >>

آمل أن يساعد.


لم أتمكن من العثور على التعابير المعتادة التي كنت أبحث عنها لذلك قمت بتعديل regex لملء متطلباتي ، ويبدو أنه يعمل بشكل جيد الآن. متطلباتي كانت:

  • مطابقة عناوين URL بدون بروتوكول (www.gooogle.com)
  • مطابقة عناوين URL بمعلمات طلب البحث ومسار ( http://subdomain.web-site.com/cgi-bin/perl.cgi?key1=value1&key2=value2e )
  • لا تطابق عناوين URL التي لا تحتوي على أحرف مقبولة (مثل "" £) ، على سبيل المثال: (www.google.com/somthing"/somethingmore)

هنا ما توصلت إليه ، أي اقتراح محل تقدير:

@Test
    public void testWebsiteUrl(){
        String regularExpression = "((http|ftp|https):\\/\\/)?[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&amp;:/~\\+#]*[\\w\\-\\@?^=%&amp;/~\\+#])?";

        assertTrue("www.google.com".matches(regularExpression));
        assertTrue("www.google.co.uk".matches(regularExpression));
        assertTrue("http://www.google.com".matches(regularExpression));
        assertTrue("http://www.google.co.uk".matches(regularExpression));
        assertTrue("https://www.google.com".matches(regularExpression));
        assertTrue("https://www.google.co.uk".matches(regularExpression));
        assertTrue("google.com".matches(regularExpression));
        assertTrue("google.co.uk".matches(regularExpression));
        assertTrue("google.mu".matches(regularExpression));
        assertTrue("mes.intnet.mu".matches(regularExpression));
        assertTrue("cse.uom.ac.mu".matches(regularExpression));

        assertTrue("http://www.google.com/path".matches(regularExpression));
        assertTrue("http://subdomain.web-site.com/cgi-bin/perl.cgi?key1=value1&key2=value2e".matches(regularExpression));
        assertTrue("http://www.google.com/?queryparam=123".matches(regularExpression));
        assertTrue("http://www.google.com/path?queryparam=123".matches(regularExpression));

        assertFalse("www..dr.google".matches(regularExpression));

        assertFalse("www:google.com".matches(regularExpression));

        assertFalse("https://[email protected]".matches(regularExpression));

        assertFalse("https://www.google.com\"".matches(regularExpression));
        assertFalse("https://www.google.com'".matches(regularExpression));

        assertFalse("http://www.google.com/path'".matches(regularExpression));
        assertFalse("http://subdomain.web-site.com/cgi-bin/perl.cgi?key1=value1&key2=value2e'".matches(regularExpression));
        assertFalse("http://www.google.com/?queryparam=123'".matches(regularExpression));
        assertFalse("http://www.google.com/path?queryparam=12'3".matches(regularExpression));

    }

I found the following Regex for URLs, tested successfully with 500+ URLs :

/\b(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)[email protected])?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[az\x{00a1}-\x{ffff}0-9]+-?)*[az\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[az\x{00a1}-\x{ffff}0-9]+-?)*[az\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[az\x{00a1}-\x{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?\b/gi

I know it looks ugly, but the good thing is that it works. :)

Explanation and demo with 581 random URLs on regex101.

Source: In search of the perfect URL validation regex


كتبت قليلا إصدار رائع يمكنك تشغيله

يطابق عناوين url التالية (وهو أمر جيد بما فيه الكفاية بالنسبة لي)

public static void main(args){
        String url = "go to http://www.m.abut.ly/abc its awesome"
        url = url.replaceAll(/https?:\/\/w{0,3}\w*?\.(\w*?\.)?\w{2,3}\S*|www\.(\w*?\.)?\w*?\.\w{2,3}\S*|(\w*?\.)?\w*?\.\w{2,3}[\/\?]\S*/ , { it ->
            "woof${it}woof"
        })
        println url

    }

http://google.com

http://google.com/help.php

http://google.com/help.php?a=5

http://www.google.com

http://www.google.com/help.php

http://www.google.com؟a=5

google.com؟a=5

google.com/help.php

google.com/help.php؟a=5

http://www.m.google.com/help.php?a=5 (وجميع التباديل)

www.m.google.com/help.php؟a=5 (وجميع التباديل)

m.google.com/help.php؟a=5 (وجميع التباديل)

الشيء المهم لأي عناوين url التي لا تبدأ بـ http أو www هي أنه يجب أن تتضمن a / أو؟

أراهن أن هذا يمكن تعديله قليلاً أكثر لكنه يؤدي المهمة إلى حد كبير لكونها قصيرة وصغيرة الحجم ... لأنك تستطيع تقسيمها إلى 3:

العثور على أي شيء يبدأ بـ http: https؟: // w {0،3} \ w *؟. \ w {2،3} \ S *

العثور على أي شيء يبدأ بـ www: www. \ w *؟. \ w {2،3} \ S *

أو العثور على أي شيء يجب أن يكون له نص ثم نقطة ثم حرفين على الأقل وبعد ذلك؟ أو /: \ w *؟. \ w {2،3} [/ \؟] \ S *


سيطابق هذا كل عناوين URL

  • مع أو بدون http / https
  • مع أو بدون www

... بما في ذلك النطاقات الفرعية وتلك الإضافات الجديدة لأسماء النطاقات ذات المستوى الأعلى مثل. متحف . الأكاديمية . الأساس الذي يمكن أن يصل إلى 63 حرفًا (ليس فقط. com ،. net ،. info الخ)

(([\w]+:)?//)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)[email protected])?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63}(:[\d]+)?(/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?

لأن الحد الأقصى لطول اسم امتداد اسم النطاق العلوي المتاح اليوم هو 13 حرفًا مثل. على الصعيد الدولي ، يمكنك تغيير الرقم 63 في التعبير إلى 13 لمنع أي شخص يسيء استخدامه.

كما javascript

var urlreg=/(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)[email protected])?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?/;

$('textarea').on('input',function(){
  var url = $(this).val();
  $(this).toggleClass('invalid', urlreg.test(url) == false)
});

$('textarea').trigger('input');
textarea{color:green;}
.invalid{color:red;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea>http://www.google.com</textarea>
<textarea>http//www.google.com</textarea>
<textarea>googlecom</textarea>
<textarea>https://www.google.com</textarea>

ويكيبيديا المادة: قائمة بجميع نطاقات المستوى الأعلى الإنترنت


whats wrong with plain and simple FILTER_VALIDATE_URL ?

 $url = "http://www.example.com";

if(!filter_var($url, FILTER_VALIDATE_URL))
  {
  echo "URL is not valid";
  }
else
  {
  echo "URL is valid";
  }

I know its not the question exactly but it did the job for me when I needed to validate urls so thought it might be useful to others who come across this post looking for the same thing


For convenience here's a one-liner regexp for URL's that will also match localhost where you're more likely to have ports than .com or similar.

(http(s)?:\/\/.)?(www\.)?[[email protected]:%._\+~#=]{2,256}(\.[a-z]{2,6}|:[0-9]{3,4})\b([[email protected]:%_\+.~#?&\/\/=]*)

I hope it's helpful for you...

^(http|https):\/\/+[\www\d]+\.[\w]+(\/[\w\d]+)?

علامة octothorpe / number-sign / hashmark لها أهمية خاصة في عنوان URL ، وعادةً ما تقوم بتعريف اسم قسم من الوثيقة. المصطلح الدقيق هو أن النص الذي يتبع التجزئة هو جزء الارتساء في عنوان URL. إذا كنت تستخدم Wikipedia ، سترى أن معظم الصفحات تحتوي على جدول محتويات ويمكنك الانتقال إلى أقسام داخل المستند مع نقطة ارتساء ، مثل:

https://en.wikipedia.org/wiki/Alan_Turing#Early_computers_and_the_Turing_test

https://en.wikipedia.org/wiki/Alan_Turing يعرّف الصفحة و Early_computers_and_the_Turing_test هي المرساة. السبب وراء استخدام Facebook والتطبيقات الأخرى التي تعتمد على Javascript (مثل My Wood & Stones ) الخاصة بالمراسي هو أنهم يريدون جعل الصفحات قابلة للحفظ (كما هو مقترح من خلال تعليق على هذه الإجابة) أو دعم زر الرجوع دون إعادة تحميل الصفحة بالكامل من الخادم .

لدعم وضع إشارة مرجعية وزر للخلف ، يجب عليك تغيير عنوان URL. ومع ذلك ، إذا قمت بتغيير جزء الصفحة (مع شيء مثل window.location = 'http://raganwald.com'; ) إلى عنوان URL مختلف أو بدون تحديد نقطة ارتساء ، فسيقوم المتصفح بتحميل الصفحة بأكملها من عنوان URL. جرب ذلك في Firebug أو Safari's Javascript console. قم بتحميل http://minimal-github.gilesb.com/raganwald . الآن في لوحة تحكم جافا سكريبت ، اكتب:

window.location = 'http://minimal-github.gilesb.com/raganwald';

سترى تحديث الصفحة من الخادم. الآن اكتب:

window.location = 'http://minimal-github.gilesb.com/raganwald#try_this';

آها! لا تحديث الصفحة! اكتب:

window.location = 'http://minimal-github.gilesb.com/raganwald#and_this';

لا يوجد حتى الآن تحديث. استخدم زر الرجوع لمعرفة أن عناوين URL هذه موجودة في سجل المتصفح. يلاحظ المتصفح أننا على نفس الصفحة ولكننا فقط نغير الرابط ، لذا لا يتم إعادة تحميله. وبفضل هذا السلوك ، يمكن أن يكون لدينا تطبيق واحد لجافا سكريبت يظهر على المتصفح ليكون على "صفحة" واحدة ، ولكن لدينا العديد من الأقسام التي تحمل إشارة مرجعية والتي تحترم الزر الخلفي. يجب أن يقوم التطبيق بتغيير نقطة الارتساء عندما يقوم المستخدم بإدخال "حالات" مختلفة ، وبالمثل إذا كان المستخدم يستخدم زر الرجوع أو إشارة مرجعية أو رابط لتحميل التطبيق مع مرساة مضمنة ، يجب أن يقوم التطبيق باستعادة الحالة المناسبة.

لذا ، يوجد لديك: توفر شركة Anchors مبرمجي جافا سكريبت بآلية لجعل التطبيقات القابلة للكتابة والقابلية للفهرسة والتوافق مع الأزرار الخلفية. هذه التقنية لها اسم: إنها واجهة صفحة واحدة .

ملاحظة: هناك فائدة رابعة لهذا الأسلوب: تحميل محتوى الصفحة عبر AJAX ثم إدخاله في DOM الحالي يمكن أن يكون أسرع بكثير من تحميل صفحة جديدة. بالإضافة إلى زيادة السرعة ، يمكن إجراء مزيد من الحيل مثل تحميل أجزاء معينة في الخلفية تحت سيطرة المبرمج.

وبالنظر إلى كل ذلك ، فإن علامة "الاختراق" أو علامة التعجب هي تلميح آخر لزاحف الويب من Google أنه يمكن تحميل الصفحة نفسها تمامًا من الخادم على عنوان URL مختلف قليلاً. انظر اياكس الزحف . أسلوب آخر هو جعل كل رابط يشير إلى عنوان URL يمكن الوصول إليه بواسطة الخادم ، ثم استخدم جافا سكريبت غير مزعجة لتغييره إلى SPI مع نقطة ارتساء.

إليك رابط المفتاح مرة أخرى: بيان واجهة الصفحة المفردة





regex url language-agnostic