Gruber의 자유주의 URL Regex를 해킹하는 데 도움이됩니다
문제
나는 그것을 가져 갔다 대담한 불 덩어리에서 자유주의 URL Regex, 그것을 병합했습니다 Alan Storm 개선 중 일부 그리고 괄호 안에 IDN 숯을 지원하는 것과 같은 일부 버그를 고치는 데 대한 내 길을 해킹했습니다. 이것이 바로 다음입니다.
/(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/
그러나 나는 해결할 수없는 버그를 만났다.
'www.dsd(sd)sdsd.com' // can also be the valid 'www.dsd.com/whatever(whatever)'
위의 URL은 다음과 같이 인식되고 있습니다 www.dsd(sd)sdsd.com'
(또는 www.dsd.com/whatever(whatever)'
) 대신에 www.dsd(sd)sdsd.com
(또는 www.dsd.com/whatever(whatever)
). URL에 괄호가있을 때만 발생하는 것 같습니다.
'www.sampleurl.com'
올바르게 인식되고 있습니다 www.sampleurl.com
.
제 생각에는 그만큼 [^[:punct:]\s]|\/
URL에 괄호가있는 경우 REGEX의 일부가 실행되지 않습니다., 나는 한동안 노력했지만 해결책을 찾을 수없는 것 같습니다. 누구든지 나를 도울 수 있습니까?
상품의 경우 a를 설정했습니다 Rubular Permalink REGEX 및 일부 테스트 데이터 (마지막 URL이 실패합니다).
Gruber의 동정인은 약간 서두르고 있다고 생각합니다. 예를 들어 URL과 같은 일과 일치하지 않습니다.
http://en.wikipedia.org/wiki/Something_(Special)_For_You
둘 다 그것을보고 더 깊은 감명을 받았습니다 그루버 그리고 앨런 이 정말 간단한 오타를 놓쳤습니다.
\([\w\d]+\)
그렇지 않을 것입니다 \(\w+\)
충분하다? :에스
해결책
것 같아 Gruber는 그의 정규 표현을 수정했습니다:
\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.])(?:[^\s()<>]+|\([^\s()<>]+\))+(?:\([^\s()<>]+\)|[^`!()\[\]{};:'".,<>?«»“”‘’\s]))
다른 팁
www.dsd (SD) sdsd.com은 유효한 도메인 이름이 아닙니다.
당신이 있었다면 'www.dsd.com/whatever(whatever)'
, 그것은 올바르게 인식 될 것입니다. (또는 적어도 내 시험에 있습니다)
/(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/
www. | | |
dsd | |
(sd) |
sdsd.com'
그게 내가 이것이 무너진다고 생각하는 방법 ... 위의 regex의 조금 (sd)
탈출 한 오픈 파렌으로 시작하고 쳐다 보는 숯불 일치 sd
, 그런 다음 탈출 한 폐쇄 된 Paren, 다음은 [^\s()<>]*
어떤 일치하는지 sdsd.com'
.