2013-08-20 4 views
0

나는regex youtube video id를 추출 하시겠습니까?

var regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&\?]*).*/; 

예를 들어이

http://www.youtube.com/watch?v=9bZkp7q19f0&desc=gangnam 

그러나 때때로 비디오 매개 변수를 먼저 오지 않는다 일치합니다 YouTube 동영상 ID를 추출하려면 다음 정규식을 가지고 결과로 다음과 일치하지 않습니다 .

http://www.youtube.com/watch?desc=gangnam&v=9bZkp7q19f0 

나는 v 매개 변수를 설명하는 정규식의 또는 절 & 또는 ? 중 하나 덧붙일되고이 포함됩니다 어떻게?

나는 다음을 시도하지만

var regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\[?$]v=)([^#\&\?]*).*/; 

답변

5

기본적으로 동영상 ID는 v= 앞에는을하고 중 하나 문자열의 끝, 또는 다음에 &. 그래서 당신이 찾고있는 정규 표현식은 단순히 이것이다 :

당신은 (하지만 정말 필요하지 않은 것) 할 수
var expr = /(?:v=)([^&]+)/; 
console.log('http://www.youtube.com/watch?v=9bZkp7q19f0&desc=gangnam'.match(expr)[1]); 
//logs "9bZkp7q19f0" 
console.log('http://www.youtube.com/watch?desc=gangnam&v=9bZkp7q19f0'.match(expr)[1]); 
//logs "9bZkp7q19f0" 

은 전체 문자열에 ? 다음에 URI (비트에 위의 패턴과 일치해야합니다 :

var expr = /\?.*(?:v=)([^&]+)/; 

당신이 결함으로 가득 차있다 시도했습니다, 그리고 너무 많은 일이, 난 그냥 그것에 대해 잊지 것입니다 고정을 시작하기 위해 예를 들어 패턴 :.

/youtu.be/ 

일치 알 이탤릭체 youtu 다음에 의 임의의 문자 (줄 바꿈이 아님) (.) 다음에 리터럴 be이옵니다. 따라서 귀하의 의견에 대응 youtu2be, youtu#be, youtu.be, 심지어 youtu be

일치 : 전부

expr = /(youtu\.be\/|[?&]v=)([^&]+)/; 
console.log('http://www.youtu.be/9bZkp7q19f0'.match(expr)[2]); 
//logs "9bZkp7q19f0" 
console.log('http://www.youtube.com/watch?desc=gangnam&v=9bZkp7q19f0'.match(expr)[2]); 
//logs "9bZkp7q19f0" 
console.log('http://youtu.be/9bZkp7q19f0'.match(/(youtu\.be\/|v=)([^&]+)/)[2]); 
//logs "9bZkp7q19f0" 
console.log(' youtube.com/watch?argv=xyz&v=u8nQa1cJyX8'.match(/(youtu\.be\/|[?&]v=)([^&]+)/)[2]); 
//logs "u8nQa1cJyX8" 

합니다. 선행을 확인할 필요가 없습니까? 또는 & ...

작동합니까 방법 :

  • (youtu\.be\/|[?&]v=) : 일치 문자 youtu.be/ 또는 중 하나?v= 또는 &v=
  • ([^&]+) : &
  • 을 제외하고, 이전의 일치를 다음과 일치 (및 그룹)의 모든

수단 그 youtu.be/<thiswillmatch>&<this will not match>youtube.com/foo/bar/watch?some=params&v=<this will match>&<this won't>. v= 비트가 ? 후 또는 앰퍼샌드 직후 인 경우,이 모든 정규식 v= 것을 발견, 다음과 첫 &까지 다음 everythign 일치한다에 관심이 중요하지 않습니다. v=을 찾을 수 없지만 youtu.be/을 찾을 수없는 경우 정규식은 슬래시 (예 : vid ID) 뒤의 모든 것을 캡처합니다.

+0

이렇게하면 http://youtu.be와 같은 URL에는 작동하지 않습니다./9bZkp7q19f0', 그냥'v'가 앰퍼샌드'&'가 앞에 붙는 경우를 설명하기 위해'? v ='의 기존 부분을 어떻게 바꾸는 지 제안 해 주시겠습니까? – user784637

+0

정규 표현식의 부분을 변경하는 올바른 구문이 무엇인지에 대한 매우 구체적인 질문을했습니다. '? v ='는 앰퍼샌드를 설명합니다. 나는 그 변화를 만들기 위해 약 2 자 정도 더 있다고 확신한다. 올바른 구문이 무엇인지 아십니까? – user784637

+1

@ user784637 : 예,하지만 저는 많은 일을하고 있다고 말하고 있습니다 ._ 같은 것을하는 대체 방식의 짧은 정규 표현식을 추가했습니다 ... 왜 사용하지 않습니까? 그러나 어쨌든,'watch \?'와 마찬가지로, 앞선 앰프와 물음표를 모두 다루는'watch \?. * (?: v =) ([^ &] +)'를 시도하십시오 –

0

당신은 유명은 = 앞서 시계가 보장하는 긍정적 예측을 incude 수 있습니다 작동하지 않았다 :

^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?(v=|.*(?=v=)))([^#\&\?]*).* 

편집 : 또한 추가로보고 귀하의 정규식을 잘못 포맷하고 따라서 embed /에 일치합니다. 명령문을 사용할 때 괄호로 명령문을 그룹화해야합니다. 또는 명령문의 이전 부분을 포함하지 않고 그 명령문 만 단독으로 일치시키지 않아도됩니다. 또한 '.'와 같은 특수 문자를 이스케이프 처리해야합니다. 이것은 내가 조금 그것을 청소 한

모든 문자로 처리됩니다 같이

/^.*youtu(\.)?be(\.com)?(\/|v\/|u\/\w\/)(embed\/|watch\?(v=|.*(?=v=)))([^#\&\?]+)/