2016-04-10 8 views
0

文字列がspotifyかyoutubeか無効なURLであるかどうかを検証したいと思います。これはうまくいくが、もっと簡単にできるようだ。どうすればより効率的にすることができますか?複数の正規表現に対する文字列のテストを簡略化する方法

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

妥当性確認のためだけの場合は、 'String.prototype.match'と'/^(?: https?:\/\ /)?(?: www \。)の代わりに 'RegExp.prototype.test'を使用します。 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 video URLには他のURLが埋め込まれていないことにお気づきのように。これは、URLの起源を確認するための簡単な方法です。 –

0

あなたがYouTubeの対、そしてあなただけの|で正規表現を組み合わせて、文字列のプロトタイプ機能を忘れることができますSpotifyは依存個別のリターンを必要としない場合:

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>

関連する問題