JavaScript에서 가장 짧은 URL 정규식 일치


16

JavaScript에서 실행될 때 텍스트의 URL과 대략 일치하는 가장 짧은 정규식을 만듭니다.

예:

"some text exampley.com".match(/your regular expression goes here/);

정규식은

  • http 및 https에 대한 모든 유효한 URL을 캡처 하십시오.
  • 실제로 유효한 URL이 아닌 URL을 찾는 문자열과 일치하지 않을까 걱정하지 마십시오. super.awesome/cool
  • JavaScript 정규식으로 실행할 때 유효

시험 기준 :

시합:

일치하지 않음 :

  • 슈퍼 / 쿨
  • 좋은 아침
  • 저 할 수 있어요
  • 여보세요.

다음은 약간의 http://jsfiddle.net/MikeGrace/gsJyr/를 명확하게하는 데 도움이되는 테스트입니다.

명확성이 결여되어 죄송합니다. 일치하는 URL이 얼마나 끔찍한 지 알지 못했습니다.


아 아아아! 편집 권한이 없습니다. 게임을 한 언어로 제한하여 해당 언어로 태그를 지정해야합니다.
dmckee --- 전 운영자 고양이

유효한 URL 문자는 무엇입니까? 단순히 \w모든 것에 사용할 수 있기 때문에 다른 URL 구성 요소에 대한 역 참조가 필요합니까?
Ming-Tang

1
RFC 2396 에 따르면 "URI는 매우 제한된 세트, 즉 기본 라틴 알파벳 문자, 숫자 및 몇 가지 특수 문자의 문자 시퀀스" 입니다.
RunnerRick

마이크 : 순서가 아직 명확하다고 생각합니다. 이제는 /:/정규 표현식으로 사용하고 유효한 URI와 일치시킬 수 있으며»Not match«목록의 모든 예제와 일치하지는 않습니다. 당신이 그 길을 가고있는 한 그것은 단순히 질문입니다 : 예제 문자열과 일치하지 않지만 여전히 모든 URI를 잡을 수있는 가장 짧은 정규 표현식은 무엇입니까?
Joey

1
더 자세한 내용으로 더 긴 도전 과제를 작성하십시오.

답변:


1
/.+\.\w\w.*/

3 개의 문자열과 일치하지 않아야하며 거의 다른 것과 일치합니다.)
upd : 여전히 5와 일치하지 않습니다.


14

이것은 작동합니다 :

var re = /(^|\s)((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)/gi;

/*
(^|\s)                            : ensure that we are not matching an url 
                                    embeded in an other string
(https?:\/\/)?                    : the http or https schemes (optional)
[\w-]+(\.[\w-]+)+\.?              : domain name with at least two components;
                                    allows a trailing dot
(:\d+)?                           : the port (optional)
(\/\S*)?                          : the path (optional)
*/

http://jsfiddle.net/9BYdp/1/ 에서 테스트를 통과합니다.

또한 일치합니다 :

  • example.com. (후행 점)
  • example.com:8080 (포트)

단맛!!!!!!!
Mike Grace

2
호스트 이름을 하나의 구성 요소 (예 : localhost) 와도 일치시키지 않겠습니까?
RunnerRick

이 공간 수
brenjt

나를 위해 작동합니다. ty :)
STEEL

잘 작동하지만 사용자 / 암호 부분이있는 도메인에는 적합하지 않습니다.http://user:password@domain.com/path
Radon8472

5

이것은 분명히 의도 한대로하지 않지만 기준에 부합합니다.

 /.*/
  • "http 및 https에 대한 모든 유효한 URL과 일치합니다."

    그렇습니다.

  • "실제로 'super.awesome / cool'과 같이 유효한 URL이 아닌 URL을 찾는 문자열이 일치하지 않을까 걱정하지 마십시오."

    예, 물론 많은 오 탐지 가있을 입니다. 그러나 그것은 중요하지 않습니다.

  • JavaScript 정규식으로 실행할 때 유효

    계란은 당신이 말한대로 작동합니다.

이 결과가 정답이 아닌 경우 기준에 따라 선택해야합니다.

의도 한대로 작동하는 규칙 되려면 실제로 전체 RFC 호환 매처를 구현해야하며 전체 RFC 호환 매처는 "일치하지 않을까 걱정"합니다.

따라서 "일치하지 않는 것을 허용"과 관련 하여 RFC와의 편차가 허용되는 것을 정확하게 지정해야합니다 .

다른 것, 그리고이 전체 운동은 가짜입니다. 사람들은 단지 그들에게 효과가있는 것을 쓰거나 그것을 좋아하는 방식으로 글을 쓰고, 짧게하기 위해 "어떤 의미를 만드는"것을 희생하기 때문입니다.

업데이트시

내가 지금까지 얻을 수있는 가장 나이브 정규 표현식은 지금까지 붙여 넣은 모든 예제와 일치합니다 (및 캡처).

/(\S+\.[^/\s]+(\/\S+|\/|))/g;

본질적으로 매우 간단하며 3 가지 기본 형식 만 가능하다고 가정합니다.

x.y
x.y/
x.y/z 

z공백이 아닌 것이 될 수 있습니다. x공백이 아닌 것이 될 수 있습니다. y공백이나 '/'문자가 아닌 모든 것이 될 수 있습니다.

이 규칙에 유효한 많은 것들이 많이 있지만, 적어도 인간에게는 유효한 URI처럼 보일 것입니다. 사양과 호환되지 않습니다.

예 :

hello.0/1  # valid 
1.2/1 # valid 
muffins://¥.µ/€  # probably valid

제정신 접근법은 URI 일 가능성이 높은 것을 추출한 다음 더 엄격한 것으로 유효성을 검사하는 것입니다. 브라우저 URI 클래스를 사용하여 유효성을 검사하는 방법을 찾고 있습니다 =).

그러나이 샘플에서 위의 추론이 작동하는 것을 볼 수 있습니다 : http://jsfiddle.net/mHbXx/


그는 질문을 변경했지만 /:/편집 후에도 어쨌든 더 잘 할 수 있습니다 :-)
Joey

고마워 마이크 =). 더 진지하게 경쟁하고 싶지는 않지만 다른 제안이 더 유용합니다. 질문의 질이 향상 될 수 있도록 초기 전제로 문제를 지적하고 싶었습니다.)
Kent Fredric

나만입니까, 아니면 "www .google .com"과 일치합니까?
Schiavini

1
/https?\:\/\/\w+((\:\d+)?\/\S*)?/

해봐

정규 표현식을 구분하는 선행 및 후행 슬래시를 포함하므로 문자 수에 영향을 미치지 않습니다.

이 패턴은 프로토콜을 http 또는 https로 제한하고 선택적 포트 번호를 허용 한 다음 공백을 제외한 모든 문자를 허용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.