은 내가 another question에 대한 답변을 바탕으로 http://daringfireball.net/2010/07/improved_regex_for_matching_urls이 정규 표현식을 "치명적인 역 추적"으로 만들지 못하게하려면 어떻게해야합니까?
(?xi)
\b
( # Capture 1: entire matched URL
(?:
https?:// # http or https protocol
| # or
www\d{0,3}[.] # "www.", "www1.", "www2." … "www999."
| # or
[a-z0-9.\-]+[.][a-z]{2,4}/ # looks like domain name followed by a slash
)
(?: # One or more:
[^\s()<>]+ # Run of non-space, non-()<>
| # or
\(([^\s()<>]+|(\([^\s()<>]+\)))*\) # balanced parens, up to 2 levels
)+
(?: # End with:
\(([^\s()<>]+|(\([^\s()<>]+\)))*\) # balanced parens, up to 2 levels
| # or
[^\s`!()\[\]{};:'".,<>?«»“”‘’] # not a space or one of these punct chars
)
)
에서 가져온 정규 표현식과 일치하는 URL을 사용하기 위해 노력하고있어, backtrack catastrophically이 정규식을 일으킬 경우가 나타납니다. 예를 들어 :
(?: # One or more:
[^\s()<>]+ # Run of non-space, non-()<>
| # or
\(([^\s()<>]+|(\([^\s()<>]+\)))*\) # balanced parens, up to 2 levels
)+
:
var re = /\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/i;
re.test("http://google.com/?q=(AAAAAAAAAAAAAAAAAAAAAAAAAAAAA)")
는
는 ... 문제가 코드의이 부분에 있다고
이 날 것으로 보인다 (크롬 등)을 실행하기 위해 정말 시간이 오래 걸릴 수 있습니다
은 ... 어떤은 (.+)+
을 포함처럼 나는 그 것을 피할 수 변화가 보이는, (.+|\((.+|(\(.+\)))*\))+
거의 비슷 것으로 보인다?
정말이 정규식을 던져서 필요한 것을 처리해야합니다. 아직 응용 프로그램을 보지 못했지만 URL 파싱을위한 정규식 (실제 파서 대신)을 사용하기에 충분히 푹신하고 URL에서 중첩 된 괄호를 처리 할만큼 충분히 심각합니다. "https? : //"로 시작하고 올바른 URL에서 %로 인코딩되어야하지만 첫 번째 문자에서 끝나는 URL은 거의 모든 것을 처리 할 것이고 정규 표현식 정규 표현식이 기하 급수적으로되지는 않습니다. –
Rubular를 사용해 보셨습니까? 그 아래에는 편리한 치트 시트가 있으며 모든 종류의 테스트 표현식을 추가하여 작동하는지 확인할 수 있습니다. (P.S. 나는 이것이 js를위한 것이라는 것을 알고있다. 그럼에도 불구하고 이것은 여전히 유용한 자원이다.) http://rubular.com/ – Edwin