2010-06-17 33 views
5

Trong ứng dụng web của tôi, tôi có một trường biểu mẫu nơi người dùng có thể nhập URL. Tôi đã làm một số xác nhận phía khách hàng sơ bộ và tôi đã tự hỏi nếu tôi có thể sử dụng một regexp để xác nhận nếu chuỗi đã nhập là một URL hợp lệ. Vì vậy, hai câu hỏi:Có an toàn để xác thực URL có regexp không?

  1. Có an toàn để thực hiện việc này với regexp không? URL là một con thú phức tạp và giống như bạn không nên sử dụng regexp để phân tích cú pháp HTML, tôi lo rằng nó có thể không phù hợp với URL.
  2. Nếu nó có thể được thực hiện, những gì sẽ là một regexp tốt cho nhiệm vụ? (Tôi biết rằng Google có vô số chế độ, nhưng tôi lo lắng về chất lượng của họ).

Mục tiêu của tôi là ngăn chặn tình huống URL xuất hiện trên trang web và không thể sử dụng được bởi trình duyệt.

+2

Xem http://stackoverflow.com/questions/1410311/regular-expression-for-url-validation-in-javascript/1411800#1411800, http://stackoverflow.com/questions/827557/how-do- bạn-validate-a-url-với-a-regular-expression-in-python/827621 # 827621 và http://stackoverflow.com/questions/226505/question-about-url-validation-with-regex/226709# 226709 –

Trả lời

0

Tôi tin rằng nó là an toàn, và trên # 1, đó không phải là một nguyên tắc kiên định nhưng nhiều hơn một phương châm, nói từ kinh nghiệm cá nhân.

Đây là một trong tôi sử dụng để xác nhận một URL:

(([\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,4}(:[\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})*)? 

Nhận ra rằng trong javascript bạn cần phải đặt '/' s xung quanh biểu thức chính quy.

+0

Nếu bạn bỏ phiếu cho câu trả lời của tôi, hãy nêu rõ lý do. –

5

Vâng ... có thể. Mọi người thường hỏi một câu hỏi tương tự về địa chỉ email, và với những người bạn sẽ cần một biểu thức chính quy phức tạp khủng khiếp (tức là một vài trang dài, ít nhất) để xác nhận chính xác chúng. Tôi không nghĩ rằng URL khá phức tạp (W3C có một số document mô tả định dạng của chúng) nhưng vẫn còn, bất kỳ regexp ngắn hợp lý nào bạn đưa ra có thể sẽ chặn một số URL hợp lệ.

Tôi khuyên bạn nên suy nghĩ về loại URL nào bạn cần chấp nhận. Có thể vì mục đích của bạn, việc chặn việc gửi không hợp lệ nhưng kỳ quặc là tốt, và trong trường hợp đó bạn có thể sử dụng một regex đơn giản phù hợp với hầu hết các URL, giống như câu trả lời của Dobiatowski. Hoặc bạn có thể sử dụng regex chấp nhận tất cả các URL hợp lệ và một vài URL không hợp lệ, nếu điều đó phù hợp với bạn. Nhưng tôi rất thận trọng khi cố gắng tìm một cụm từ thông dụng chấp nhận chính xác tất cả các URL hợp lệ và không có URL hợp lệ. Nếu bạn muốn có xác minh 100% dễ hiểu theo cách đó, tôi khuyên bạn nên sử dụng xác thực phía máy khách của loại thứ hai tôi đã đề cập (chấp nhận một vài URL không hợp lệ) và thực hiện kiểm tra toàn diện hơn ở phía máy chủ, sử dụng một số thư viện bằng bất kỳ ngôn ngữ nào bạn đang sử dụng để xử lý dữ liệu biểu mẫu.

+0

Vâng, xác thực địa chỉ email. Đó là nơi phổ biến khác mà regex dường như chỉ là thứ cho công việc - nhưng thất bại thảm hại khi bạn cố gắng làm điều đó. Tôi đã quên điều này, nhưng đó là một lý do khác khiến tôi mệt mỏi khi sử dụng regex để xác thực một URL. –

+0

Tôi thực sự không thích xác nhận địa chỉ email. Một số người nói rằng một '+' trong địa chỉ email không hợp lệ. Tôi thực sự thích một tính năng của Gmail, nơi nó bỏ qua phần sau '+' và cho phép bạn sắp xếp email theo nửa thứ hai đó. Rất khó chịu khi xác nhận không thành công. – icktoofay

+0

+1 tất cả các điểm rất hợp lệ. Tôi đã nhìn thấy một regex dài một trang để xác nhận URL bằng thông số RFC. Nếu một regex đơn giản có thể bao gồm phần lớn các trường hợp, thì đó là đủ tốt cho hầu hết các mục đích thực tế. Bạn sẽ không bao giờ hoặc hiếm khi cần phải khớp các trường hợp cạnh như [http: // to.] (Http: // to.) Hoặc [http: // travel] (http: // travel) cả hai trường hợp đều hợp lệ và hiện có url btw. – Anurag

2

Regex an toàn cho tính hợp lệ từ vựng, nhưng điều đó không có nghĩa là trang web sẽ ở đó. Bạn sẽ thực sự phải kiểm tra kết nối để xem đó có phải là URL hợp lệ hay không bằng cách kiểm tra phản hồi được trả về. Trong tất cả, nó phụ thuộc vào yêu cầu người dùng của bạn để nói những gì là hợp lệ và những gì không phải là - làm thế nào an toàn/an toàn nó là phụ thuộc vào bạn. Nếu bạn có một cái gì đó như http://foo.com/?referral=http://bar.com/, nó sẽ phá vỡ một số tập lệnh vì người dùng không mong đợi một giao thức/đường dẫn kết hợp khác làm tham số. Ngoài ra, một số ký tự đặc biệt khác và các hacks byte rỗng đã được biết là làm những thứ có nhiều thông số, nhưng tôi không nghĩ có bất kỳ sự tấn công Regex thành công nào - có lẽ là tràn bộ nhớ?

Nếu đây là thứ cần bảo mật, có lẽ nó nên được xử lý ở phía máy chủ. Mặc dù bạn có thể thực hiện Javascript phía máy chủ, tôi có thể khuyên bạn nên Perl, vì nó được thiết kế/phát triển như một trình phân tích cú pháp dựa trên văn bản.

Regex chỉ cao cấp hoặc hạn chế khi bạn thực hiện. Con người là hợp lý, do đó các vấn đề mà họ giải quyết có thể được giải quyết bằng một công cụ logic (máy tính), với điều kiện là các hướng dẫn chính xác (trong trường hợp này là mẫu biểu thức chính quy) được đưa ra để làm theo.

@Kerry:

Trong javascript bạn không "phải" đặt '/' s xung quanh biểu thức chính quy. Ngoài ra còn có điều kiện nơi bạn có thể đặt nó trong dấu ngoặc kép: var re = new Regexp("\w+");

Web Ví dụ:

Tôi nghĩ rằng Kerry là khá tốt đẹp, mặc dù tôi chỉ cho nó một cái nhìn w/o kiểm tra nó, nhưng đây là một số ví dụ đơn giản tìm thấy từ web

http://www.javascriptkit.com/script/script2/acheck.shtml:

// Email Check 
var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i 
if (filter.test("email address or variable here")){...} 

http://snippets.dzone.com/posts/show/452:

// URL Validation 
function isUrl(s) { 
    var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/ 
    return regexp.test(s); 
} 

Cuối cùng, điều này có vẻ đầy hứa hẹn.
http://www.weberdev.com/get_example-4569.html:

// URL Validation 
function isValidURL(url){ 
    var RegExp = /^(([\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,4}(:[\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})*)?$/; 
    if(RegExp.test(url)){ 
     return true; 
    }else{ 
     return false; 
    } 
} 

// Email Validation 
function isValidEmail(email){ 
    var RegExp = /^((([a-z]|[0-9]|!|#|$|%|&|'|\*|\+|\-|\/|=|\?|\^|_|`|\{|\||\}|~)+(\.([a-z]|[0-9]|!|#|$|%|&|'|\*|\+|\-|\/|=|\?|\^|_|`|\{|\||\}|~)+)*)@((((([a-z]|[0-9])([a-z]|[0-9]|\-){0,61}([a-z]|[0-9])\.))*([a-z]|[0-9])([a-z]|[0-9]|\-){0,61}([a-z]|[0-9])\.)[\w]{2,4}|(((([0-9]){1,3}\.){3}([0-9]){1,3}))|(\[((([0-9]){1,3}\.){3}([0-9]){1,3})\])))$/ 
    if(RegExp.test(email)){ 
     return true; 
    }else{ 
     return false; 
    } 
} 
+0

Thông thường, thực hành an toàn và tốt là không đặt tên cho các biến chức năng của bạn sau các kiểu đối tượng gốc như 'RegExp'. Ngoài ra, 'if..else' chỉ là thừa. Bạn chỉ có thể trả về giá trị của 'regex.test (..)' khi bạn đang làm trong hàm 'isUrl'. – Anurag

+0

Như tôi đã nêu trong câu hỏi, tôi chỉ muốn tránh một URL không hợp lệ xuất hiện trên một trang web. Đó là adminpanel phụ trợ của một (loại a) CMS mà tôi đang làm việc, vì vậy tôi tin tưởng người dùng sẽ nhập URL. Tôi không muốn lọc ra các URL "xấu". Tôi chỉ muốn ngăn chặn lỗi chính tả, sao chép và dán các lỗi khác mà bạn không nhận thấy cho đến khi khách truy cập của bạn bắt đầu khiếu nại. –

+1

@Anurag, các ví dụ được kéo (chưa sửa đổi) từ các URL nằm ở trên chúng. Nói rằng tôi đang làm nó không đúng, nó là tác giả của trang đó đang làm nó. Tôi chỉ đơn thuần kéo mã mẫu của các mẫu regex mẫu, không phải cho Javascript xung quanh chúng. @Vilx, ví dụ regex dài thêm mà bạn đã liệt kê dường như có nhiều sự lặp lại. Tôi sẽ phải xem xét nó, nhưng tôi nghĩ rằng các giao thức khác nhau nên có gần như giống hệt nhau regex - ex. bạn có thể làm (http | ftp) s *. Nếu tôi đã làm nó theo cách của bạn, tôi sẽ có các biến regex khác nhau cho mỗi giao thức và đầu tiên kiểm tra những gì nó được giao thức. – vol7ron

4

Như đã trình bày bởi Crescent Fresh, trong các ý kiến, có những câu hỏi tương tự với trang này mà tôi không tìm thấy. One of them còn cung cấp các tiêu chuẩn tuân thủ đầy đủ regex để phê chuẩn một URL:

(?:http://(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?)\. 
)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:\.(?:\d+) 
){3}))(?::(?:\d+))?)(?:/(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F 
\d]{2}))|[;:@&=])*)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{ 
2}))|[;:@&=])*))*)(?:\?(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{ 
2}))|[;:@&=])*))?)?)|(?:ftp://(?:(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(? 
:%[a-fA-F\d]{2}))|[;?&=])*)(?::(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a- 
fA-F\d]{2}))|[;?&=])*))[email protected])?(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|- 
)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(? 
:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?))(?:/(?:(?:(?:(?:[a-zA-Z\d$\-_.+! 
*'(),]|(?:%[a-fA-F\d]{2}))|[?:@&=])*)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'() 
,]|(?:%[a-fA-F\d]{2}))|[?:@&=])*))*)(?:;type=[AIDaid])?)?)|(?:news:(?: 
(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;/?:&=])[email protected](?:(?:(
?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[ 
a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:\.(?:\d+)){3})))|(?:[a-zA-Z](
?:[a-zA-Z\d]|[_.+-])*)|\*))|(?:nntp://(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[ 
a-zA-Z\d]|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d 
])?))|(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?)/(?:[a-zA-Z](?:[a-zA-Z 
\d]|[_.+-])*)(?:/(?:\d+))?)|(?:telnet://(?:(?:(?:(?:(?:[a-zA-Z\d$\-_.+ 
!*'(),]|(?:%[a-fA-F\d]{2}))|[;?&=])*)(?::(?:(?:(?:[a-zA-Z\d$\-_.+!*'() 
,]|(?:%[a-fA-F\d]{2}))|[;?&=])*))[email protected])?(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a 
-zA-Z\d]|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d] 
)?))|(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?))/?)|(?:gopher://(?:(?: 
(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?: 
(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+ 
))?)(?:/(?:[a-zA-Z\d$\-_.+!*'(),;/?:@&=]|(?:%[a-fA-F\d]{2}))(?:(?:(?:[ 
a-zA-Z\d$\-_.+!*'(),;/?:@&=]|(?:%[a-fA-F\d]{2}))*)(?:%09(?:(?:(?:[a-zA 
-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;:@&=])*)(?:%09(?:(?:[a-zA-Z\d$ 
\-_.+!*'(),;/?:@&=]|(?:%[a-fA-F\d]{2}))*))?)?)?)?)|(?:wais://(?:(?:(?: 
(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?: 
[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))? 
)/(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))*)(?:(?:/(?:(?:[a-zA 
-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))*)/(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(
?:%[a-fA-F\d]{2}))*))|\?(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d] 
{2}))|[;:@&=])*))?)|(?:mailto:(?:(?:[a-zA-Z\d$\-_.+!*'(),;/?:@&=]|(?:% 
[a-fA-F\d]{2}))+))|(?:file://(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d] 
|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?: 
(?:\d+)(?:\.(?:\d+)){3}))|localhost)?/(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'() 
,]|(?:%[a-fA-F\d]{2}))|[?:@&=])*)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(
?:%[a-fA-F\d]{2}))|[?:@&=])*))*))|(?:prospero://(?:(?:(?:(?:(?:[a-zA-Z 
\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-) 
*[a-zA-Z\d])?))|(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?)/(?:(?:(?:(? 
:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[?:@&=])*)(?:/(?:(?:(?:[a- 
zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[?:@&=])*))*)(?:(?:;(?:(?:(?:[ 
a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[?:@&])*)=(?:(?:(?:[a-zA-Z\d 
$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[?:@&])*)))*)|(?:ldap://(?:(?:(?:(?: 
(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?: 
[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))? 
))?/(?:(?:(?:(?:(?:(?:(?:[a-zA-Z\d]|%(?:3\d|[46][a-fA-F\d]|[57][Aa\d]) 
)|(?:%20))+|(?:OID|oid)\.(?:(?:\d+)(?:\.(?:\d+))*))(?:(?:%0[Aa])?(?:%2 
0)*)=(?:(?:%0[Aa])?(?:%20)*))?(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F 
\d]{2}))*))(?:(?:(?:%0[Aa])?(?:%20)*)\+(?:(?:%0[Aa])?(?:%20)*)(?:(?:(? 
:(?:(?:[a-zA-Z\d]|%(?:3\d|[46][a-fA-F\d]|[57][Aa\d]))|(?:%20))+|(?:OID 
|oid)\.(?:(?:\d+)(?:\.(?:\d+))*))(?:(?:%0[Aa])?(?:%20)*)=(?:(?:%0[Aa]) 
?(?:%20)*))?(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))*)))*)(?:(
?:(?:(?:%0[Aa])?(?:%20)*)(?:[;,])(?:(?:%0[Aa])?(?:%20)*))(?:(?:(?:(?:(
?:(?:[a-zA-Z\d]|%(?:3\d|[46][a-fA-F\d]|[57][Aa\d]))|(?:%20))+|(?:OID|o 
id)\.(?:(?:\d+)(?:\.(?:\d+))*))(?:(?:%0[Aa])?(?:%20)*)=(?:(?:%0[Aa])?(
?:%20)*))?(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))*))(?:(?:(?: 
%0[Aa])?(?:%20)*)\+(?:(?:%0[Aa])?(?:%20)*)(?:(?:(?:(?:(?:[a-zA-Z\d]|%(
?:3\d|[46][a-fA-F\d]|[57][Aa\d]))|(?:%20))+|(?:OID|oid)\.(?:(?:\d+)(?: 
\.(?:\d+))*))(?:(?:%0[Aa])?(?:%20)*)=(?:(?:%0[Aa])?(?:%20)*))?(?:(?:[a 
-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))*)))*))*(?:(?:(?:%0[Aa])?(?:%2 
0)*)(?:[;,])(?:(?:%0[Aa])?(?:%20)*))?)(?:\?(?:(?:(?:(?:[a-zA-Z\d$\-_.+ 
!*'(),]|(?:%[a-fA-F\d]{2}))+)(?:,(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-f 
A-F\d]{2}))+))*)?)(?:\?(?:base|one|sub)(?:\?(?:((?:[a-zA-Z\d$\-_.+!*'(
),;/?:@&=]|(?:%[a-fA-F\d]{2}))+)))?)?)?)|(?:(?:z39\.50[rs])://(?:(?:(? 
:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(? 
:[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+)) 
?)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))+)(?:\+(?:(?: 
[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))+))*(?:\?(?:(?:[a-zA-Z\d$\-_ 
.+!*'(),]|(?:%[a-fA-F\d]{2}))+))?)?(?:;esn=(?:(?:[a-zA-Z\d$\-_.+!*'(), 
]|(?:%[a-fA-F\d]{2}))+))?(?:;rs=(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA 
-F\d]{2}))+)(?:\+(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))+))*) 
?))|(?:cid:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;?:@&= 
])*))|(?:mid:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;?:@ 
&=])*)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;?:@&=] 
)*))?)|(?:vemmi://(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z 
\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:\ 
.(?:\d+)){3}))(?::(?:\d+))?)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a 
-fA-F\d]{2}))|[/?:@&=])*)(?:(?:;(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a 
-fA-F\d]{2}))|[/?:@&])*)=(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d 
]{2}))|[/?:@&])*))*))?)|(?:imap://(?:(?:(?:(?:(?:(?:(?:[a-zA-Z\d$\-_.+ 
!*'(),]|(?:%[a-fA-F\d]{2}))|[&=~])+)(?:(?:;[Aa][Uu][Tt][Hh]=(?:\*|(?:(
?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[&=~])+))))?)|(?:(?:;[ 
Aa][Uu][Tt][Hh]=(?:\*|(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2 
}))|[&=~])+)))(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[ 
&=~])+))?))@)?(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d]) 
?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:\.(?: 
\d+)){3}))(?::(?:\d+))?))/(?:(?:(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?: 
%[a-fA-F\d]{2}))|[&=~:@/])+)?;[Tt][Yy][Pp][Ee]=(?:[Ll](?:[Ii][Ss][Tt]| 
[Ss][Uu][Bb])))|(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2})) 
|[&=~:@/])+)(?:\?(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[ 
&=~:@/])+))?(?:(?:;[Uu][Ii][Dd][Vv][Aa][Ll][Ii][Dd][Ii][Tt][Yy]=(?:[1- 
9]\d*)))?)|(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[&=~ 
:@/])+)(?:(?:;[Uu][Ii][Dd][Vv][Aa][Ll][Ii][Dd][Ii][Tt][Yy]=(?:[1-9]\d* 
)))?(?:/;[Uu][Ii][Dd]=(?:[1-9]\d*))(?:(?:/;[Ss][Ee][Cc][Tt][Ii][Oo][Nn 
]=(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[&=~:@/])+)))?)) 
)?)|(?:nfs:(?:(?://(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA- 
Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?: 
\.(?:\d+)){3}))(?::(?:\d+))?)(?:(?:/(?:(?:(?:(?:(?:[a-zA-Z\d\$\-_.!~*' 
(),])|(?:%[a-fA-F\d]{2})|[:@&=+])*)(?:/(?:(?:(?:[a-zA-Z\d\$\-_.!~*'(), 
])|(?:%[a-fA-F\d]{2})|[:@&=+])*))*)?)))?)|(?:/(?:(?:(?:(?:(?:[a-zA-Z\d 
\$\-_.!~*'(),])|(?:%[a-fA-F\d]{2})|[:@&=+])*)(?:/(?:(?:(?:[a-zA-Z\d\$\ 
-_.!~*'(),])|(?:%[a-fA-F\d]{2})|[:@&=+])*))*)?))|(?:(?:(?:(?:(?:[a-zA- 
Z\d\$\-_.!~*'(),])|(?:%[a-fA-F\d]{2})|[:@&=+])*)(?:/(?:(?:(?:[a-zA-Z\d 
\$\-_.!~*'(),])|(?:%[a-fA-F\d]{2})|[:@&=+])*))*)?))) 

Rõ ràng đây là như điên như tôi sợ nó sẽ được, vì vậy tôi sẽ suy nghĩ lại toàn bộ sự việc.

Vì vậy, câu trả lời là - có, nó có thể được thực hiện, nhưng bạn nên REALLY suy nghĩ hai lần cho dù bạn muốn làm điều đó theo cách này. Hoặc chấp nhận rằng regex sẽ không hoàn hảo.

Các vấn đề liên quan