2010-06-17 2 views
5

내 웹 응용 프로그램에서 사용자가 URL을 입력 할 수있는 양식 필드가 있습니다. 이미 예비 클라이언트 측 유효성 검사를하고 있는데, 입력 된 문자열이 유효한 URL인지 확인하기 위해 정규 표현식을 사용할 수 있는지 궁금합니다. 그래서, 두 가지 질문 :정규 표현식을 사용하여 URL의 유효성을 검사하는 것이 안전합니까?

  1. 정규 표현식으로이 작업을 수행하는 것이 안전합니까? URL은 복잡한 짐승이며, HTML을 파싱하기 위해 정규 표현식을 사용하지 않아야하는 것처럼 URL에 대해서도 적합하지 않을까 걱정됩니다.
  2. 할 수 있으면 작업에 대한 좋은 정규 표현식은 무엇입니까? (나는 구글이 무수한 정규 표현식을 만들어 낸다는 것을 알고 있지만, 나는 그들의 품질에 대해 걱정하고있다).

내 목표는 URL은 웹 페이지에 표시하고 브라우저에 의해 사용할 수 없게되는 상황을 방지하는 것입니다.

+2

참조 http://stackoverflow.com/questions/1410311/regular-expression-for-url-validation-in-javascript/1411800#1411800, http://stackoverflow.com/questions/827557/how-do- python/827621 # 827621 및 http://stackoverflow.com/questions/226505/question-about-url-validation-with-regex/226709#에 정규 표현식을 사용하여 정규식을 사용하여 유효성을 검사하십시오. 226709 –

답변

0

나는 그것이 안전 믿는다, 그리고 # 1이라고 생각 개인적인 경험으로 말하기.

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

당신이 정규 표현식 주위에 '/'의 넣어야 할 자바 스크립트에서 그 실현 :

내가 URL의 유효성을 검사하는 데 사용하는 것입니다.

+0

귀하가 제 응답을 회신하는 경우 그 이유를 설명하십시오. –

5

음 ... 아마도. 사람들은 이메일 주소에 대해 비슷한 질문을 자주하고, 그 사람들을 올바르게 검증하기 위해 끔찍하게 복잡한 정규 표현식 (즉, 몇 페이지 이상)이 필요합니다. 나는 URL이 꽤 복잡하다고 생각하지 않는다. (W3C는 그들의 형식을 설명하는 document을 가지고있다.) 그래도 합리적으로 짧은 정규 표현식은 아마도 유효한 URL을 막을 것이다.

어떤 종류의 URL을 수락해야하는지 생각해 보시기 바랍니다. 어쩌면 당신의 목적을 위해서 가끔 유효하지만 이상한 제출을 막는 것이 좋을 것이며,이 경우 Dobiatowski의 답과 같은 대부분의 URL에 일치하는 간단한 정규 표현식을 사용할 수 있습니다. 또는 모든 유효한 URL을 허용하는 정규 표현식을 사용할 수 있습니다. 유효하지 않은 정규 표현식을 사용할 수도 있습니다. 하지만 모든 유효한 URL과 유효하지 않은 URL을 정확하게 받아들이는 정규 표현식을 찾으려고 할 때 조심해야합니다. 그런 식으로 100 % 확실한 확인을 원한다면 언급 한 두 번째 유형의 클라이언트 측 유효성 검사 (몇 가지 잘못된 URL 허용)를 사용하고 서버 측에서보다 포괄적 인 검사를 수행하고 라이브러리를 사용하여 양식 데이터를 처리하는 데 사용합니다.

+0

예, 이메일 주소 확인. 그것은 정규 표현식이 작업의 단순한 것으로 보이는 다른 일반적인 장소입니다.하지만 일단 시도하면 비참하게 실패합니다. 이 점을 잊어 버렸지 만 URL 유효성 검사에 정규 표현식을 사용하는 것에 지친 또 다른 이유가 있습니다. –

+0

나는 이메일 주소 검증을 정말 싫어한다. 몇몇은 이메일 주소의'+'가 유효하지 않다고 말합니다. Gmail의 기능 중 '+'다음 부분을 무시하고 그 하반기까지 이메일을 분류 할 수있는 기능을 정말 좋아합니다. 유효성 검사가 실패하면 매우 짜증납니다. – icktoofay

+0

+1 매우 유효한 모든 포인트. RFC 사양에 따라 URL의 유효성을 검사 할 때 한 페이지 길이의 정규식을 보았습니다. 간단한 정규 표현식이 대다수의 경우를 다룰 수 있다면 가장 실용적인 목적으로는 충분합니다. 유효하거나 존재하는 [http : // ~] (http : // ~.) 또는 [http : // travel] (http : // travel)과 같은 경계 사례는 절대로 일치하지 않아도됩니다. urls btw. – Anurag

2

Regex 's는 어휘 유효성 때문에 안전하지만 사이트가 거기에있을 것임을 의미하지는 않습니다. 반환 된 응답을 확인하여 연결을 테스트하여 유효한 URL인지 확인해야합니다. 무엇이 유효하고 무엇이 아닌지 사용자의 요구 사항에 달려 있습니다. 즉, 안전/보안은 사용자에 따라 다릅니다. http://foo.com/?referral=http://bar.com/과 같은 것이 있으면 사용자가 다른 프로토콜/경로 콤보를 매개 변수로 기대하지 않기 때문에 일부 스크립트가 중단됩니다. 또한, 다른 특수 문자와 null 바이트 해킹 매개 변수와 물고기 같은 일을하는 것으로 알려져 있지만 Regex 해킹 - 아마도 메모리 오버플로가있을 것이라고 생각하지 않습니다?

보안이 필요한 것이면 서버 측에서 처리해야합니다. 서버 측 자바 스크립트를 수행 할 수는 있지만 Perl을 권장합니다. 텍스트 기반 파서로 설계/개발 되었기 때문입니다.

정규 표현식은 사용자가 고급으로 사용하거나 제한적으로 사용할 수 있습니다. 인간은 논리적이므로 논리적 엔진 (컴퓨터)을 사용하여 해결할 수 있습니다. 정확한 지침 (이 경우 정규 표현식 패턴)이 제공되어야합니다.

@Kerry : 자바 스크립트에서

당신이 정규 표현식 주위에 '/'의 넣어 "해야"하지 않습니다. var re = new Regexp("\w+");

웹 예 : : 여기를 확인하지만/O를 일부입니다 승 나는 단지 그것을 한 눈에 준하지만 케리는 꽤 좋은 생각

따옴표에 넣어 수있는 조건이있다

// 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 : 웹

http://www.javascriptkit.com/script/script2/acheck.shtml에서 발견 간단한 예

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

마지막으로 유망 해 보입니다.
http://www.weberdev.com/get_example-4569.html : Crescent Fresh에 의해 언급 된 의견에, 내가 찾지 못했습니다 이것과 같은 질문이 있기 때문에

// 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

일반적으로 'RegExp'와 같은 원시 객체 유형 뒤에 함수 변수의 이름을 지정하지 않는 것이 안전하고 좋은 방법입니다. 또한'if..else'는 단지 중복됩니다. 당신은'isUrl' 함수에서하고있는 것처럼'regex.test (..)'의 값을 반환 할 수 있습니다. – Anurag

+0

질문에서 언급했듯이 웹 페이지에 잘못된 URL이 나타나지 않도록하고 싶습니다. 그것이 제가 일하고있는 (일종의) CMS의 백엔드 관리자 패널입니다. 따라서 URL을 입력 할 사용자를 신뢰합니다. 나는 "나쁜"URL을 걸러 내고 싶지 않다. 나는 단지 오타, 복사 - 붙여 넣기 오류 및 방문자가 불평하기 시작할 때까지 알지 못하는 다른 문제를 방지하고자합니다. –

+1

@Anurag에서 예제는 그 위에있는 URL에서 가져온 것입니다 (수정되지 않았습니다). 제가하고있는 일이 부적절하다고 말하는 것은 그것을하는 페이지의 저자입니다. 나는 단지 Javascript가 아닌 예제 정규식 패턴의 코드를 가져왔다. @Vilx, 당신이리스트 한 여분의 긴 정규식 예제는 많은 반복이있는 것 같습니다. 나는 그것을 조사해야 하겠지만, 다른 프로토콜은 거의 동일한 정규 표현식을 가져야한다고 생각한다. 당신은 (http | ftp) s * 할 수 있습니다. 내가 당신의 방식대로한다면, 나는 각 프로토콜에 대해 다른 정규 표현식 변수를 가지게 될 것이고 어떤 프로토콜인지 먼저 확인하게 될 것이다. 반대로 – vol7ron

4

. 나는 그것이 될 우려로

(?: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})|[:@&=+])*))*)?))) 

은 분명히이 같은 미친 짓이야, 그래서 나는 모든 것을 다시 생각됩니다 : One of them 또한 URL의 유효성을 확인하는 전체 표준 호환 정규 표현식을 제공합니다.

대답은 - 예, 할 수 있지만,해야합니다. 정말로은이 방법을 사용할지 여부를 두 번 생각해야합니다. 또는 정규 표현식이 불완전하다는 것을 받아들입니다.

관련 문제