2016-04-10 2 views
0

Я хочу проверить, является ли строка точным, или URL-адрес YouTube или неверный. Это работает, но, похоже, это можно сделать проще. Как я могу сделать его более эффективным?Как упростить тестирование строки для нескольких регулярных выражений

String.prototype.spotifyUrl = function() { 
    return this.match(/^(spotify:|https:\/\/[a-z]+\.spotify\.com\/)/); 
} 

String.prototype.youtubeUrl = function() { 
    return this.match(/^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$/); 
} 

function validateUrl (url) { 
    if (url.spotifyUrl()) { 
    alert('spotify'); 
    } 
    else if (url.youtubeUrl()) { 
    alert('youtube'); 
    } 
    else { 
    alert('invalid url'); 
    } 
}; 

validateUrl('https://open.spotify.com/track/3JiockjOTd8m2VGcTGkmew'); 

JS Fiddle

+1

почему так сложное регулярное выражение для 'youtube'? – rock321987

+0

Я бы оставил это как есть, вам нужна логика, чтобы решить, что имеет в виду регулярное выражение. Пойдите для более простого решения и сэкономить ваше время. – iSS

+0

, если он предназначен только для проверки, используйте 'RegExp.prototype.test' вместо' String.prototype.match' и '/^(?: https?: \/\ /)? (?: www \.)? youtu (?: \. be \/| be \ .com) \ // 'должно быть достаточно. –

ответ

0

Если цель состоит в том, чтобы просто проверить происхождение URL, то короткий будет проверять только для spotify.com или youtu.be или youtube.com.

function validateUrl(url) { 
 
    if (url.match(/spotify\.com/)) { 
 
    alert('spotify'); 
 
    } else if (url.match(/youtu\.be|youtube\.com/)) { 
 
    alert('youtube'); 
 
    } else { 
 
    alert('invalid url'); 
 
    } 
 
}; 
 

 
validateUrl('https://open.spotify.com/track/3JiockjOTd8m2VGcTGkmew');

+0

Он менее эффективен, чем исходный шаблон (потому что он не привязан). –

+0

Я предполагаю, что причина, по которой он использует более сложное регулярное выражение, заключается в том, что, например, «spotify.com» может появляться в любом месте URL-адреса, _e.g._ ссылочный URL-адрес в строке запроса. –

+0

Как вы могли заметить, у YouTube-URL-адреса YouTube нет другого встроенного в него URL-адреса. Так что это всего лишь грубый или более короткий способ проверить происхождение URL. –

0

Если вам не нужны отдельные декларации, которые зависят от Spotify против YouTube, то вы можете просто комбинировать регулярные выражения с | и забыть о функции Строка прототипа:

function validateUrl(url) { 
 
    if (url.match(/^(spotify:|https:\/\/[a-z]+\.spotify\.com\/)|^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$/)) { 
 
    alert('valid'); 
 
    } else { 
 
    alert('invalid url'); 
 
    } 
 
}; 
 

 
validateUrl('https://open.spotify.com/track/3JiockjOTd8m2VGcTGkmew');

1

Вы можете создать объект со свойством на сайте вы хотите признать:

var sites = { 
 
    spotify: /^(spotify:|https:\/\/[a-z]+\.spotify\.com\/)/, 
 
    youtube: /^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$/, 
 
}; 
 

 
function validateUrl (url) { 
 
    for (var site in sites) { 
 
     if (url.match(sites[site])) return site; 
 
    } 
 
}; 
 

 
// I/O: 
 
var div = document.querySelector('div'); 
 
var input = document.querySelector('input'); 
 

 
input.oninput = reportValidation; 
 

 
function reportValidation() { 
 
    div.textContent = validateUrl(input.value) || 'invalid url'; 
 
} 
 
reportValidation();
Type URL:<br> 
 
<input type="text" size="60" value="https://open.spotify.com/track/3JiockjOTd8m2VGcTGkmew"> 
 
<div></div>

Смежные вопросы