2015-02-01 2 views
2

Clojure에서 문자열이 지정된 유효한 URL을 반환하려면 어떻게해야합니까?Clojure Regex : 문자열이 URL 인 경우 반환 문자열

(re-matches #"????" "www.example.com")) 
(re-matches #"????" "http://example.com")) 
(re-matches #"????" "http://example.org")) // returns "http://example.org" 
(re-matches #"????" "htasdtp:/something")) // returns nil 
+0

이 문제가

는 URL이 정규 표현식을 사용하여 확인하는 방법에 대한 변종의 많은 페이지입니다 ? 유효한 URL이 값을 반환하고 스크랩이 nil을 반환하는 것처럼 보입니다. 또는 나는 무엇인가 놓치 느냐? –

+0

URL을 식별하는 올바른 URL 정규식을 알아내는 데 문제가 있습니다. –

+0

유효한 URL에 대한 사양을 사용하십시오. 정규식은 16k 바이트를 넘지 않아야합니다. – sln

답변

10

유효성 검사 URL은 간단하지 않습니다. 아마도 regexp로 검증하기에는 너무 복잡합니다. 다행히도 Apache Commons이라는 라이브러리가 있으며 UrlValidator이 포함되어 있습니다.

Clojure는 Java 라이브러리를 사용할 수 있으므로 Apache Commons의 UrlValidator를 사용하여 프로그램의 URL을 검증 할 수 있습니다.

먼저 종속성을 project.clj에 추가하십시오. 의존성 벡터에 다음 줄을 추가하십시오.

[commons-validator "1.4.1"] 

그리고, 당신은 부울을 반환하는 함수, valid-url?을 정의 할 수 있습니다.

(import 'org.apache.commons.validator.UrlValidator) 

(defn valid-url? [url-str] 
    (let [validator (UrlValidator.)] 
    (.isValid validator url-str))) 

이제이 기능으로 원하는 것을 할 수 있습니다. 또는 인수가 유효한 URL 인 경우 위의 함수를 수정하여 URL 문자열을 반환 할 수 있습니다.

+0

어떻게 Clojurescript에서 가져 와서 사용할 수 있습니까? 더 많은 네임 스페이스 아래에 있다고 가정합니다 : require하지만 형식이 어떻게되어야하는지 잘 모르겠습니다. –

+3

clojure보다는 clojurescript에서 이런 종류의 기능이 필요하다면 비슷한 접근법을 사용하되 java가 아닌 javascript 라이브러리를 사용하십시오. clojure와 clojurescript는 매우 유사하지만 동일한 것은 아닙니다. 특히 interop 계층이 다릅니다. Clojure는 Java 기반이며 Java 객체에 대한 기본 인터페이스를 가지고 있습니다. Javascript는 OO 언어가 아니기 때문에 상호 운영 측면에서 약간 다른 동작/제한이 있습니다. 그러나 자바 스크립트 라이브러리를 가져올 수 있으므로 URL 유효성 검사 기능이있는 라이브러리를 선택하여 사용하십시오. –

1

ClojureScript 정규 표현식이 기본 JavaScript 정규 표현식으로 컴파일되므로 ClojureScript에서 URL의 유효성을 검사하는 방법을 기본적으로 묻는 것은 자바 스크립트에서이를 수행하는 방법입니다. https://mathiasbynens.be/demo/url-regex

Diego Pierini's Javascript solution입니다 : ClojureScript에서

/^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)[email protected])?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|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]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,}))\.?)(?::\d{2,5})?(?:[/?#]\S*)?$/i 

:

(def url-pattern #"(?i)^(?:(?:https?|ftp)://)(?:\S+(?::\S*)[email protected])?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|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]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,}))\.?)(?::\d{2,5})?(?:[/?#]\S*)?$") 

(re-matches url-pattern "http://www.google.com") 
관련 문제