Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Извлечь из ссылки число (https://javascript.ru/forum/misc/23941-izvlech-iz-ssylki-chislo.html)

Dorian_bs 12.12.2011 18:43

Извлечь из ссылки число
 
Всем привет!
Помогите правильно извлечь число (выделено жирным) из ссылки:

http://site.ru/load/38-1-0-138

Дело в том, что можно было бы использовать рег. выражения. но в данном случае числа перед 138 могут быть любой длинны.
Как я понял, нужно как то записать в поиске, что происходит считывание числа после определенного "-".

Получается, но только наоборот. То есть вырезается 138, а остальное остается. Нужно сделать, что бы вырезалось все, кроме 138

var sa = 'http://site.ru/load/38-1-0-138';
sa.slice(0, -3);

Livanderiaamarum 12.12.2011 18:44

function lastNumber(_url, _word){
			_word?_word=_word:_word = '-'
			var start
			for(var i=_url.length-1; i >= 0; i--){
						if(_url[i] == _word){
									start = i
									break
						}
			}
			return parseInt(_url.slice(start+1),10)
}


принимает ссылку, возвращает число после последнего знака " - "

вторым аргументом можно передавать символ после последнего которого брать число, если не передать, то по умолчанию этот символ равен знаку минус))

nerv_ 12.12.2011 19:16

\как понял
var x = "http://site.ru/load/38-1-0-138".split("-").pop();
alert(x);

Livanderiaamarum 12.12.2011 19:21

Цитата:

Сообщение от nerv_ (Сообщение 142268)
\как понял
var x = "http://site.ru/load/38-1-0-138".split("-").pop();
alert(x);

браво:victory: но мой метод быстрее:)

Dorian_bs 12.12.2011 19:48

Спасибо Вам большое))

Nekromancer 12.12.2011 19:48

Livanderiaamarum,
Ой, ну да ладно. А зачем то так было мудрить :)
_word?_word=_word:_word = '-'

Вот вам 2 варианта, куда попроще:
var word = arguments[1] || '-';

word = word || '-'

А вместо последней вашей кучи кода, нельзя было сделать так что ле:
var str = 'http://site.ru/load/38-1-0-138';
alert(str.slice(++str.lastIndexOf('-')));

И вообще, по хорошему одна регулярка решает все проблемы и там уже вытаскивай какой хочешь индекс :)

Livanderiaamarum 12.12.2011 19:51

Цитата:

Сообщение от Nekromancer (Сообщение 142278)
Livanderiaamarum,
Ой, ну да ладно. А зачем то так было мудрить :)
_word?_word=_word:_word = '-'

Вот вам 2 варианта, куда попроще:
var word = arguments[1] || '-';

word = word || '-'

А вместо последней вашей кучи кода, нельзя было сделать так что ле:
var str = 'http://site.ru/load/38-1-0-138';
alert(str.slice(++str.lastIndexOf('-')));

И вообще, по хорошему одна регулярка решает все проблемы и там уже вытаскивай какой хочешь индекс :)

ахахахахахаа))) я забыл про существование lastIndexOf )))) пипец)!!
я даже щас подумал сделать какой нить такой метод))) спасибо что напомнили)

trikadin 12.12.2011 19:59

Nekromancer, в фф ошибка, ибо инкремент не к переменной, а к числу)

Так:
str="http://site.ru/load/38-1-0-138";
alert(str.slice(str.lastIndexOf("-")+1));

Nekromancer 12.12.2011 20:07

trikadin,
Ты прав, да. Я с начала запустил с обычным сложением а потом поменял на инкремент.
Что то я совсем упустил, что он не возвращает значение, а изменяет исходное :) Попытка излишней оптимизации.

рони 12.12.2011 21:07

Вариант...
var sa = 'http://site.ru/load/38-1-0-138';
alert(sa.match(/\d+$/))

nerv_ 12.12.2011 21:20

Цитата:

Сообщение от Livanderiaamarum
но мой метод быстрее

С чего Вы взяли? :) Встроенные функции работают достаточно быстро, и хоть первый раз мой алгоритм был не вполне адекватен, он быстрее Вашего, по крайней мере в IE) Но в FF медленнее ^_^

p.s.: IE неадекватен. Разница с FF во времени исполнения ппц.
/**********************************************************/
var timer = (new Date()).getTime();
for(var i = 0; i < 100000; i++) {
	var x = "http://site.ru/load/38-1-0-138".split("-").pop();
}
alert((new Date()).getTime() - timer); // IE - 1109, FF - 75
/**********************************************************/
var timer = (new Date()).getTime();
for(var i = 0; i < 100000; i++) {
	var x = "http://site.ru/load/38-1-0-138";
	x = x.substring(x.lastIndexOf("-") + 1);
}
alert((new Date()).getTime() - timer); // IE - 375, FF - 11
/**********************************************************/
function lastNumber() {
	var _url = "http://site.ru/load/38-1-0-138";
	var _word = "-";
	var start;
	for(var i=_url.length-1; i >= 0; i--){
				if(_url.charAt(i) == _word){
					start = i;
					break;
				}
	}
	return _word = _url.slice(start+1);
}
//.........
var timer = (new Date()).getTime();
for(var i = 0; i < 100000; i++) {
	lastNumber();
}
alert((new Date()).getTime() - timer); // IE - 1281, FF - 20
/**********************************************************/
var timer = (new Date()).getTime();
for(var i = 0; i < 100000; i++) {
	var sa = 'http://site.ru/load/38-1-0-138'.match(/\d+$/)[0];
}
alert((new Date()).getTime() - timer); // IE - 1219, FF - 249

Nekromancer 12.12.2011 21:43

128
25
33
522

Linux.

trikadin 12.12.2011 22:03

57
14
65
203

Linux)

Livanderiaamarum 12.12.2011 22:59

С чего Вы взяли? Встроенные функции работают достаточно быстро, и хоть первый раз мой алгоритм был не вполне адекватен, он быстрее Вашего, по крайней мере в IE) Но в FF медленнее ^_^

function lastNumber(_url, _word){
			_word?_word=_word:_word = '-'
			var start //индекс вхождения
			for(var i=_url.length-1; i >= 0; i--){
						if(_url[i] == _word){
									start = i
									break
						}
			}
			return parseInt(_url.slice(start+1),10)
}




function qq(){
			var start = new Date().getTime();
			for(var i=0; i < 100000; i++){
						//lastNumber("http://site.ru/load/38-1-0-138")
						//parseInt("http://site.ru/load/38-1-0-138".split("-").pop(),10)
			}
			log(new Date().getTime() - start)
}
qq()


раскомментируйте по очереди строчки, мою и вашу) в моей 50 , в вашей 150 ;)

Nekromancer 12.12.2011 23:23

trikadin,
У меня нетбук ;)

trikadin 12.12.2011 23:31

Цитата:

Сообщение от Nekromancer
У меня нетбук

Так без претензий же) Это было просто для статистики.

Livanderiaamarum 12.12.2011 23:49

Цитата:

Сообщение от melky (Сообщение 142365)
//http://site.ru/load/38-1-0-138

function lastNumber(_url, _word){
			_word?_word=_word:_word = '-'
			var start
			for(var i=_url.length-1; i >= 0; i--){
						if(_url[i] == _word){
									start = i
									break
						}
			}
			return parseInt(_url.slice(start+1),10);
}



function lastNum2(str){
    return  (str=str.split())[str.length-1];
};
function lastNumber3 (str){
	return str.substring(str.lastIndexOf("-") + 1);
};



function lastNumber4(_url) {
	var _word = "-";
	var start;
	for(var i=_url.length-1; i >= 0; i--){
				if(_url.charAt(i) == _word){
					start = i;
					break;
				}
	}
	return _word = _url.slice(start+1);
}

var started;
var res = [];
var count = 1000000;
var i = 0;
var str = "http://site.ru/load/38-1-0-138";

started = Date.now();
for(i=0;i<count;i+=1) lastNumber(str, "-");
res.push( Date.now() -  started );

started = Date.now();
for(i=0;i<count;i+=1) lastNum2(str);
res.push( Date.now() -  started );

started = Date.now();
for(i=0;i<count;i+=1) lastNumber3(str);
res.push( Date.now() -  started );

started = Date.now();
for(i=0;i<count;i+=1) lastNumber4(str);
res.push( Date.now() -  started );

alert(res)


моя ф-я чуть медленней lastNumber3 в FF и намного быстрее её в chromium

ого, а моя у меня выдает 50, а другого парня 160-200, странно это как то О_О может для справедливость их нужно в разное время запускать? удивительные резльтаты))

melky 12.12.2011 23:50

bullshit

лучший вариант, по-моему мнению, от nerv_ (ф-я)

Livanderiaamarum, для тестировнаия скоростей есть замечательный сайт http://jsperf.com.
предлагаю его обкатать :)

devote 13.12.2011 00:27

пи**ками еще померьтесь

trikadin 13.12.2011 00:29

Цитата:

Сообщение от devote
пи**ками

Хера себе ты вежливый.

Nekromancer 13.12.2011 00:35

devote,
Никто ничем не здесь не меряются. Здесь вполне адекватно проверяют тот или иной способ одной задачи на производительность. Может конечно слегка примитивно, но это ничего не меняет.

devote 13.12.2011 00:36

Цитата:

Сообщение от trikadin
Хера себе ты вежливый.

Да вы ерундой занимаетесь просто, каждый браузер в каждой платформе всегда дают разные результаты. И если выбирать один из примеров, то для каждего браузера свой способ хорош... Это давно всем известно. И кричать о том что мой способ быстрее, это глупо... потому как в твоем браузере да. в моем нет.

Nekromancer 13.12.2011 00:37

О, тю, давайте писать для каждого браузера свой JS код. А чё, в детстве мало с ИЕ наигрались?)

Livanderiaamarum 13.12.2011 00:38

Цитата:

Сообщение от melky (Сообщение 142369)
bullshit

лучший вариант, по-моему мнению, от nerv_ (ф-я)

Livanderiaamarum, для тестировнаия скоростей есть замечательный сайт http://jsperf.com.
предлагаю его обкатать :)

ШИКААРНО!!!!! спасибо тебе огромное)!

Livanderiaamarum 13.12.2011 00:39

Цитата:

Сообщение от Nekromancer (Сообщение 142385)
О, тю, давайте писать для каждого браузера свой JS код. А чё, в детстве мало с ИЕ наигрались?)

Нужно проводить сравнение производительности ВО ВСЕХ браузерах и находить среднее арифметическое. ))

Nekromancer 13.12.2011 00:41

Livanderiaamarum,
Нужно отталкиваться от ситуации.

Нужна скорость - lastIndexOf.
Нужна расширяемость - регулярки.
Нужно простота - split/pop.

trikadin 13.12.2011 00:44

Цитата:

Сообщение от Nekromancer
О, тю, давайте писать для каждого браузера свой JS код. А чё, в детстве мало с ИЕ наигрались?)

Дык это... Тут про dart недавно была тема (язык гугловский новый, если кто не в курсе). И там вскользь упоминалось, что при компиляции в JS он будет создавать отдельные копии для каждого браузера, со всеми необходимыми оптимизациями.

Так что... ;)

Nekromancer 13.12.2011 00:50

trikadin,
Да в курсе, все уши уже им прожужжали. Я конечно за развитие и всё такое, но меня ES6 больше прельщает, чем Dart.

trikadin 13.12.2011 00:54

Цитата:

Сообщение от Nekromancer
Да в курсе, все уши уже им прожужжали. Я конечно за развитие и всё такое, но меня ES6 больше прельщает, чем Dart.

+1.

nerv_ 13.12.2011 08:59

Цитата:

Сообщение от Nekromancer
Нужно отталкиваться от ситуации.

Полностью согласен :yes:


Часовой пояс GMT +3, время: 11:48.