2010-01-14 3 views
3

나는 현재 검증 URL에 다음과 같은 정규 표현식을 사용하고 있습니다에 정규식이 필요 :의 URL 및 지원 20 %의 유효성을 검사하고()

^(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?#Username:Password)(?:\w+:\[email protected])? (?#Subdomains)(?:(?:[-\w]+\.)+(?#TopLevel Domains)(?:com|org|net|gov|mil|biz|edu|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?#Port)(?::[\d]{1,5})?(?#Directories)(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?#Query)(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?#Anchor)(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?$ 

내가 웹상에서이 빌린를 (기억이 안나요 경우)이을 개선하는 방법 :

^((https?|file|ftp|gopher|news|nntp):\/\/)([a-z]([a-z0-9\-]*\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)|(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&]*)?)?(#[a-z][a-z0-9_]*)?$ 

그러나, 이들 중 어느 것도이 URL을 검증 할 수있다() 유효해야한다 :

http://somedomain.com/users/1234/images/Staff%20Photos%202008/FirstName%20LastName_1%20(Small).jpg 

문제는 % 20 및 대괄호()입니다. 내가 할 수도있는 것처럼 시도해보십시오. 위의 URL을 올바르게 검증하기 위해 위의 정규 표현식을 얻을 수 없습니다. 멋진 정규 표현식을 작성하는 데 익숙하지 않아 도움이되지 않습니다. 내가 발견 한 다른 모든 웹 결과는 다음과 같은 바보 같은 일에 실패합니다.

http://www.test..com 

도움을 주시면 감사하겠습니다.

+1

정규 표현식이이 용도에 적합한 도구라고 생각하지 않습니다. 정규식을 사용해야하는 이유가 있습니까? –

+0

어떤 언어를 사용하고 있습니까? 아마 그것을 검증하는 또 다른 방법이있을 것입니다. –

+0

안녕하세요, 저는 실제로 ASP.NET MVC에서 C#을 사용하여 웹 응용 프로그램을 작성하고 있습니다. 내 유효성 검사 레이어는 Regex를 사용하여 입력 한 URL이 유효한지 확인합니다 (전자 메일 및 전화 확인과 비슷 함). URL은 인터넷 및 인트라넷에있는 파일의 위치를 ​​나타냅니다. 양식을 게시 할 때이 유효성 검사를 수행하는 정규식보다 나은 방법이 있습니까? –

답변

4

동일한 정규 표현식으로 두 가지를 검증하고 있습니다 :

  • 가 잘 형성 -이 구문 맞습니까?
  • 그럴듯 함 - 프로토콜과 최상위 도메인이 그럴듯 해?

이러한 유효성 검사를 분리하면 효과적 일 수 있습니다. 이 정규 표현식을 사용하여 URI가 올바른 형식인지 확인할 수 있습니다. 그것은 RFC 3986, Uniform Resource Identifiers (URI): Generic Syntax 부록 B. (P 50)에서 나온 :

^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? 

를 URI이 정규 표현에 일치하는 경우가 잘 형성되어있다. 당신이 할 수있는,

2 (scheme) : "http" 
4 (authority): "somedomain.com" 
5 (path)  : "https://stackoverflow.com/users/1234/images/Staff%20Photos%202008/FirstName%20LastName_1%20(Small).jpg" 
7 (query) : nil 
9 (fragment) : nil 

을 이제 각각의 조각을 가지고 있음 :

scheme = $2 
authority = $4 
path  = $5 
query  = $7 
fragment = $9 

이의 당신이 준 것을 시료에서 나오는 URI 보자 : 경기 그룹은 당신에게있는 다양한 정보를 제공 각각의 가능성을 확인하십시오. 예를 들어, 권위에서 TLD를 얻을 수있는 권한이 정규 표현식을 적용

\.([^.])$ 

그룹 1은 당신에게 당신이 다음 목록에 대해 확인할 수 있습니다 TLD (COM, 조직 등)를 제공합니다.

+0

나는 양식과 타당성을 테스트하기 위해 하나의 정규식을 사용하지 않는다는 말을 결코 들어 본 적이 없다. 이 아이디어는 훌륭하지만 조금 더 많은 작업이 필요합니다. (경로)에 권장되는 정규식을 사용하고 있습니까? –

+1

경로에 대해 추가 정규식이 필요하다고 생각하지 않습니다. 권위에 관해서는 위의 정규 표현식을 사용하여 추출한 후 목록 (com, org 등)과 비교하여 확인하십시오. 귀하의 목록 (http, ftp 등)에 대한 구성표를 확인하십시오.나는 너무 많이 확인하지 않을 것입니다. 단지 그것이 잘 형성되었다는 것을 알면 이미 여러분에게 가장 큰 이익을 얻었습니다. 더 많은 검사는 새로운 TLD와 프로토콜이 도입 될 때 현재 또는 미래에 좋은 URI를 거부하도록하는 비용을 점진적으로 줄여줍니다. –

관련 문제