2014-05-08 2 views
3

이것은 간단해야하지만, 저를 떠나고 있습니다. www가 있든 없든 프로토콜의 유무에 관계없이 URL을 일치시키는 좋은 방법과 나쁜 방법이 많이 있습니다. 내가 가진 문제는 자바 스크립트에서입니다 : 정규식을 사용하여 텍스트 문자열의 URL을 일치시키고 'domain.com'과 일치하도록 설정하면 전자 메일 주소의 도메인도 잡아줍니다 ('@'뒤에 나오는 부분). 나는 싫어. 부정적인 lookbehind로 해결되지만 JS에서는 분명히 아닙니다.domain.com과 일치하는 Regex는 @ domain.com이 아닙니다.

이 지금까지 내 가장 가까운 성공 :

/^(www\.)?([^@])([a-z]*\.)(com|net|edu|org)(\.au)?(\/\S*)?$/g 

하지만 경기는 문자열의 시작에없는 경우이 오류가 발생합니다. 그리고 나는 그것이 틀린 길을 돌보고 있다고 확신합니다. 거기에 간단한 대답이 있습니까? 그러나 코멘트에서 언급 한 바와 같이

\b(www\.)?([^@])(\w*\.)(\w{2,3})(\.\w{2,3})?(\/\S*)?$ 

이 여전히 후에 도메인과 일치 :

편집 : 오히려 하위 도메인을 허용보다 'WWW'와 아래의 코멘트 몇 가지에 대응하는 정규 표현식 개정 (스틱 @.

덕분에 경기는 문자열의 시작이 아닌 경우 실패

+0

[질문] (http://stackoverflow.com/questions/641407/javascript-negative-lookbehind-equivalent) * 도움이 될 수 있습니다. – merlin2011

+5

사이드 노트 : 사용 가능한 또는 곧 제공 될 새로운 TLD의 엄청난 양을 알고 있습니까? – Marty

+0

http://regexr.com/ – HJ05

답변

0

많은 엉망이 된 후에,이 작업이 끝났습니다 (명확한 모자 티 @의 zmo의 마지막 코멘트에 P) :

var rx = /\b(www\.)?(\w*@)?([a-zA-Z\-]*\.)(com|org|net|edu|COM|ORG|NET|EDU)(\.au)?(\/\S*)?/g; 
var link = txt.match(rx); 
    if(link !== null) { 
    for(var i = 0; i < link.length; i++) { 
     if (link[i].indexOf('@') == -1) { 
     //create link 
     } else { 
     //create mailto; 
     } 
     } 
     } 

나는 등 (이 @ zmo 위에서 언급 한 하위 도메인, TLD를, 관련하여 제한 알고 있어요 - 당신이 모든 URL을 잡을 필요가 있다면, 나는 당신이 그 코드를 적용 할 것을 제안했다.) 그러나 그것은 나의 경우의 주된 이슈가 아니었다. 내 답변에있는 코드는 'www.'가없는 텍스트 문자열에있는 URL과 일치시킬 수 있으며 전자 메일 주소의 도메인을 포착하지도 않습니다.

1

이 때문에 경기의 시작 부분에 ^의의 :

/(www\.)?([^@])([a-z]*\.)(com|net|edu|org)(\.au)?(\/\S*)?$/g

js> "www.foobar.com".match(/(www\.)?([^@])([a-z]*\.)(com|net|edu|org)(\.au)?(\/\S*)?$/g) 
["www.foobar.com"] 
js> "aoeuaoeu foobar.com".match(/(www\.)?([^@])([a-z]*\.)(com|net|edu|org)(\.au)?(\/\S*)?$/g) 
[" foobar.com"] 
js> "[email protected] foobar.com".match(/(www\.)?([^@])([a-z]*\.)(com|net|edu|org)(\.au)?(\/\S*)?$/g) 
[" foobar.com"] 
js> "[email protected] [email protected]".match(/(www\.)?([^@])([a-z]*\.)(com|net|edu|org)(\.au)?(\/\S*)?$/g) 
["foobar.com"] 

를 여전히 도메인 앞에 공백을 일치 비록. 그리고 그것은 도메인에 대한 잘못된 가정을하고 있습니다 ...

  • xyz.example.org은 정규 표현식과 일치하지 않는 유효한 도메인입니다.
  • www.3x4mpl3.org은 regexp와 (과) 일치하지 않는 유효한 도메인입니다.
  • example.co.uk은 정규 표현식과 일치하지 않는 유효한 도메인입니다.
  • ουτοπία.δπθ.gr은 정규 표현식과 일치하지 않는 유효한 도메인입니다.

무엇이 합법적 인 도메인 이름을 정의합니까? 이것은 점으로 구분 된 UTF-8 문자의 연속입니다. 서로 뒤 따르는 두 개의 점을 가질 수 없으며 표준 이름은 \w\.\w\w입니다 (하나의 문자가 있다고는 생각하지 않습니다).

비록, 내가 할 줄 방법은 단순히 는 점 분리하여 단어 경계 텍스트 (\b) 모든 것을 고려하여, 같은 도메인을 보이는 모든 일치하는 것입니다

/\b(\w+\.)+\w+\b/g

js> "aoe toto.example.org uaoeu foo.bar aoeuaoeu".match(/\b(\w+\.)+\w+\b/g) 
["toto.example.org", "foo.bar"] 
js> "aoe [email protected] toto.example.org uaoeu foo.bar aoeuaoeu".match(/\b(\w+\.)+\w+\b/g) 
["example.org", "toto.example.org", "foo.bar"] 
js> "aoe [email protected] toto.example.org uaoeu foo.bar aoeuaoeu f00bar.com".match(/\b(\w+\.)+\w+\b/g) 
["example.org", "toto.example.org", "foo.bar", "f00bar.com"] 

두 번째 라운드에서 도메인이 실제로 존재하는지 여부를 확인하거나 발견 된 도메인 목록에 있는지 확인하십시오.단점은 자바 스크립트에서 regexps는 유니 코드 문자를 검사 할 수 없으며 \b 또는 \w은 유효한 도메인 이름으로 ουτοπία.δπθ.gr을 수락하지 않습니다. ES6에서

는, (내가 지금까지 테스트 한하지만 없음) 최신 브라우저에서 작동해야 /u modifier, 거기 :

"ουτοπία.δπθ.gr aoe [email protected] toto.example.org uaoeu foo.bar aoeuaoeu".match(/\b(\w+\.)+\w+\b/gu) 

편집 :

부정적인 lookbehind 그것을 해결 - 하지만 분명히 JS에 없습니다.

네, 그것은 것입니다 : 모든 전자 메일 주소를 건너 뛰는, 여기에 정규식 구현 뒤에 작업 모습입니다 :

/(?![^@])?\b(\w+\.)+\w+\b/g

js> "aoe [email protected] toto.example.org uaoeu foo.bar aoeuaoeu f00bar.com".match(/(?<![^@])?\b(\w+\.)+\w+\b/g) 
["toto.example.org", "foo.bar", "f00bar.com"] 

는 유니 코드와 같은 비록 ... 그것 ' JS에 곧있을거야.

일치하는 정규 표현식에 @을 실제로 보존하고 일치하는 항목을 버리면됩니다. 그는 @ 포함

js> "toto.net aoe [email protected] toto.example.org uaoeu foo.bar aoeuaoeu f00bar.com".match(/@?\b\w+\.+\w+\b/g).map(function (x) { if (!x.match(/@/)) return x }) 
["toto.net", (void 0), "toto.example", "foo.bar", "f00bar.com"] 

또는 현대 브라우저가 있어야 ES6/JS1.7의 새로운 지능형리스트를 사용을 ...

[x for x of "toto.net aoe [email protected] toto.example.org uaoeu foo.bar aoeuaoeu f00bar.com".match(/@?\b\w+\.+\w+\b/g) if (!x.match(/@/))]; 

일 최종 업데이트 :

/@?\b(\w*[^\W\d]+\w*\.+)+[^\W\d_]{2,}\b/g

> "x.y tot.toc.toc $11.00 11.com 11foo.com toto.11 toto.net aoe [email protected] toto.example.org uaoeu foo.bar aoeuaoeu f00bar.com".match(/@?\b(\w*[^\W\d]+\w*\.+)+[^\W\d_]{2,}\b/g).filter(function (x) { if (!x.match(/@/)) return x }) 
[ 'tot.toc.toc', 
    '11foo.com', 
    'toto.net', 
    'toto.example.org', 
    'foo.bar', 
    'f00bar.com' ] 
+0

이것은 regex101.com에서 유효성 검사에 실패하지만 Firebug를 통과 한 것 같습니다. 어떤 경우이든, 나는 '$ 1'같은 것을 잡는 것을 막기 위해 그것을 업데이트했다.(\ w \ 2,3) (\. \ w {2,3}) (\/\) \ S *)? \ b/g;'. 내 전자 메일 일치 코드 앞에 배치하면 여전히 도메인과 일치하고 전자 메일 일치는 실패합니다. 전자 메일 일치 후에 URL과 일치하면 작동하지만 텍스트와 mailto href가 모두 일치하므로 많은 작업을 수행하고있는 것으로 보입니다. 적어도 모든 것은 작동합니다. 그래서 이것이 대답인지 아닌지 잘 모르겠습니다. 어쨌든 고마워. – sideroxylon

+1

글쎄, 전자 메일과 fqdn을 일치시켜야하고 전자 메일 변형 코드로 전자 메일을 필터링하고 도메인을 도메인 변환 코드로 필터링해야합니다. 그것은 물건을 더 간단하게 만들 것입니다. www가 도메인을 시작한다고 가정하면 잘못된 것입니다. 그러나 도메인은 숫자 일 수 없으며 적어도 하나의 문자가 있어야합니다. 그리고 어쨌든 도메인을 테스트하는 표준 방법은 단 하나뿐입니다. 실제로 DNS 레지스트리를 기준으로 도메인을 검사하는 것입니다. – zmo

+0

은 숫자 tld 또는 숫자 도메인 또는 문자 하나만 기반으로 잘못된 도메인을 제거하는 정규식을 추가했습니다. – zmo

관련 문제