2016-04-10 6 views
0

Ich möchte überprüfen, ob die Zeichenfolge spotify oder youtube oder eine ungültige URL ist. Das funktioniert, aber es scheint, es könnte einfacher gemacht werden. Wie kann ich es effizienter machen?So vereinfachen Sie das Testen einer Zeichenfolge gegen mehrere Regexes

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

warum so kompliziert regex für 'youtube'? – rock321987

+0

Ich würde es so lassen, wie es ist, Sie brauchen die Logik, um zu entscheiden, worauf sich die Regex bezieht. Entscheiden Sie sich für die einfachere Lösung und sparen Sie Zeit. – iSS

+0

Wenn es nur für Validierungszwecke ist, verwenden Sie 'RegExp.prototype.test' anstelle von' String.prototype.match' und '/^(?: https?: \/\ /)? (?: www \.)? youtu (?: \. be \/| be \ .com) sollte genügen. –

Antwort

0

Wenn der Zweck nur ist überprüfen die Herkunft der URL dann kürzer wird nur für spotify.com oder youtu.be oder youtube.com zu überprüfen.

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

Es ist weniger effizient als das ursprüngliche Muster (weil nicht verankert). –

+0

Ich stelle mir den Grund, warum er eine komplexere Regex verwendet, dass beispielsweise "spotify.com" irgendwo in der URL erscheinen könnte, zB eine verweisende URL in der Abfrage-Zeichenfolge. –

+0

Wie Sie vielleicht bemerkt haben, sind in der YouTube-URL keine anderen URLs eingebettet. Dies ist nur eine grobe oder kürzere Möglichkeit, den Ursprung der URL zu überprüfen. –

0

Wenn Sie keine separaten Renditen brauchen, die im Vergleich zu YouTube auf Spotify ab, dann können Sie nur die regulären Ausdrücke mit | kombinieren, und vergessen Sie die String-Prototyp-Funktion:

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

Sie könnten ein Objekt mit einer Eigenschaft pro Seite machen Sie erkennen wollen:

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>

Verwandte Themen