#javascript #regex
#javascript #регулярное выражение
Вопрос:
Я хотел бы сохранить подстроку в переменной javascript, используя регулярное выражение, если нет другого / более простого способа. Например, у меня есть такая ссылка: http://www.youtube.com/watch?v=sEHN4t29oXYamp;feature=related
Я хочу получить только sEHN4t29oXYamp;feature=related, поэтому, я думаю, мне придется проверить, появится ли первый знак равенства, и после этого сохранить остальную часть этой строки в переменной.. пожалуйста, помогите, спасибо
Комментарии:
1. цель просто получить параметры url?
Ответ №1:
Эффективный:
variable = variable.substring(variable.indexOf('?v=') 3) // First occurence of ?v=
Регулярное выражение:
variable = variable.replace(/.*?v=/, '') // Replace last occurrence of ?v= and any characters before it (except r or n) with nothing. ? has special meaning, that is why the is required
variable = variable.replace(/.*??v=/, '') // Variation to replace first occurrence.
Ответ №2:
Вот так:
var match = /?v=(. )/.exec(link)[1];
Ответ №3:
не с регулярным выражением, но тоже просто, потому что первая часть url статична и имеет длину 23 символа
'http://www.youtube.com/watch?v=sEHN4t29oXYamp;feature=related'.substr(23)
О, я допустил ошибку, он хочет другую часть, поэтому фактический код будет выглядеть так:
'http://www.youtube.com/watch?v=sEHN4t29oXYamp;feature=related'.substr(31)
Комментарии:
1. На самом деле, даже более эффективно, чем мое решение. Просто требуется точное соответствие формата исходному URL.
Ответ №4:
Я думаю, что самый простой способ получить параметр из строки запроса — использовать следующий код:
var u = new URI('http://www.youtube.com/watch?v=sEHN4t29oXYamp;feature=related');
u.getQuery('v') //sEHN4t29oXY
u.getQuery('feature') //related
Теперь кто-то должен кричать на меня с комментарием типа:
В JavaScript нет объекта URI, вы не можете этого сделать!!!11one
И этот кто-то был бы прав, так что поехали:
/**
* URI.js by zzzzBov
*/
(function (w) {
"use strict";
var URI = function (str) {
if (!this) {
return new URI(str);
}
if (!str) {
str = window.location.toString();
}
var parts, uriRegEx, hostParts;
//http://labs.apache.org/webarch/uri/rfc/rfc3986.html#regexp
uriRegEx = /^(([^:/?#] ):)?(//([^/?#]*))?([^?#]*)(?([^#]*))?(#(.*))?/;
str = str.toString();
parts = uriRegEx.exec(str);
this.protocol = parts[1] || '';
this.host = parts[4] || '';
this.pathname = parts[5] || '';
this.search = parts[6] || '';
this.hash = parts[8] || '';
//logic to break host into hostname:port
hostParts = this.host.split(':');
this.hostname = hostParts[0] || '';
this.port = hostParts[1] || '';
};
URI.prototype = {
getQuery: function (i) {
var o;
o = URI.parseQueryString(this.search);
return i === undefined ? o : o[i];
},
setQuery: function (val) {
var s;
s = URI.buildQueryString(val);
this.search = s.length ? '?' s : s;
},
toString: function () {
return this.protocol '//' this.host this.pathname this.search this.hash;
}
};
URI.parseQueryString = function (str) {
var obj, vars, i, l, data, rawKey, rawVal, key, val;
obj = {};
if (!str) {
return obj;
}
//make sure it's a string
str = str.toString();
if (!str.length || str === '?') {
return obj;
}
//remove `?` if it is the first char
if (str[0] === '?') {
str = str.substr(1);
}
vars = str.split('amp;');
for (i = 0, l = vars.length; i < l; i = 1) {
data = vars[i].split('=');
rawKey = data[0];
rawVal = data.length > 1 ? data[1] : '';
//if there's a key, add a value
if (rawKey) {
key = URI.decode(rawKey);
val = URI.decode(rawVal);
//check if obj[key] is set
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'string') {
//if it's a string turn it to an array
obj[key] = [ obj[key], val ];
} else {
//it's an array, push
obj[key].push(val);
}
} else {
obj[key] = val;
}
}
}
return obj;
};
URI.buildQueryString = function (obj) {
var arr, key, val, i;
function build(key, value) {
var eKey, eValue;
eKey = URI.encode(key);
eValue = URI.encode(value);
if (eValue) {
arr.push(eKey '=' eValue);
} else {
arr.push(eKey);
}
}
arr = [];
for (key in obj) {
if (obj.hasOwnProperty(key)) {
val = obj[key];
//isArray check
if (Object.prototype.toString.call(val) === '[object Array]') {
for (i in val) {
if (val.hasOwnProperty(i)) {
build(key, val[i]);
}
}
} else {
build(key, val);
}
}
}
return arr.join('amp;');
};
URI.decode = decodeURIComponent;
URI.encode = encodeURIComponent;
w.URI = URI;
}(window));