Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Заменить регуляркой число после id= в URL (https://javascript.ru/forum/misc/52106-zamenit-regulyarkojj-chislo-posle-id%3D-v-url.html)

kostyanet 04.12.2014 12:31

Заменить регуляркой число после id= в URL
 
Добился пока что таких успехов:

var url='http://example.com/model/catalog?pid=807&id=123&on=87';

var id = 999;

url.replace(/&id=(\d+)/, '&id='+id);

/*
httр://example.com/model/catalog?pid=807&id=999&on=87
*/


но, сами понимаете что вместо & может быть ? (или не может быть, если его выкинуть из location.search) если id будет на первом месте, а если без & и без ?, то, если pid= встретится первым - он и будет заменен.

Задача такая что или надо добавлять несусветное количество ссылок в таблицу - это как раз очень просто в php, - или написать скриптик который будет хватать id строки и посылать браузер в новый location, в котором всяких параметров может быть дофига и все их надо сохранить, а id=n заменить.

Помогите кто понимает в регах как составить такую регу. Спасибо.

krutoy 04.12.2014 13:23

Вот так вроде работает
var url1='http://example.com/model/catalog?pid=807&id=123&on=87';
var url2='http://example.com/model/catalog?pid=807?id=123&on=87';
var url3='http://example.com/model/catalog?pid=807id=123&on=87';
var id = 999;
console.log(url1.replace(/(\W)(id=)\d+/, '$1$2'+id))
console.log(url2.replace(/(\W)(id=)\d+/, '$1$2'+id))
console.log(url3.replace(/(\W)(id=)\d+/, '$1$2'+id))
    
//  [url]http://example.com/model/catalog?pid=807&id=999&on=87[/url]
//  [url]http://example.com/model/catalog?pid=807?id=999&on=87[/url]
//  [url]http://example.com/model/catalog?pid=807id=123&on=87[/url]

особо не парился, ибо ты не достоин
Зы не не работает в последней строке, только что заметил

kostyanet 04.12.2014 13:27

Спасибо, в этой теме вы блеснули и спасли меня от позора. Еще раз спасибо. Плюсовать не могу, ибо прошлый минус еще не сгорел :)

krutoy 04.12.2014 13:31

kostyanet,
Рано радоваться, я лоханулся. Последний случай не работает, я сразу ен заметил:) Щас подумаю, как решить.

kostyanet 04.12.2014 13:32

В смысле я уже собирался на хэшкод идти жаловаться на javascript.ru

kostyanet 04.12.2014 13:34

Не бывает таких вариантов! Всегда есть амперсанд, или ?, если в самом начале. Так что все работает пучком.

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

krutoy 04.12.2014 13:44

Цитата:

Сообщение от kostyanet
Не бывает таких вариантов! Всегда есть амперсанд, или ?

А-а-а, а то я уже придумал как можно было б. а если так, то надежней, кажись, будет вот так
var url1='http://example.com/model/catalog?pid=807&id=123&on=87';
var url2='http://example.com/model/catalog?pid=807?id=123&on=87';
var id = 999;
re=/(&|\?)(id=)\d+/
console.log(url1.replace(re, '$1$2'+id))
console.log(url2.replace(re, '$1$2'+id))

//  [url]http://example.com/model/catalog?pid=807&id=999&on=87[/url]
//  [url]http://example.com/model/catalog?pid=807?id=999&on=87[/url]

kostyanet 04.12.2014 14:02

А, так вот оно как, надо было экранировать только спец-вопрос. Я так делал, ну, по аналогии, есть у меня похожие варианты в кодах, но забил и амперсанд обратным слешем и ничего не менялось. Ну то есть я делал похоже. Это одуреть можно всматриваться в эти черточки и буквочки, ну ладно, запишу и это на всякий случай.

Функция получилась все равно уродской.

table.addEventListener("click",function(e){
	var row=e.target.parentNode;
	if(!row.parentNode.nodeName.match(/tbody/i)) { // эта рега была давно
		e.preventDefault();
		return false;
	}
	var id=row.id.replace(/\D/g,\'\'); // эту регу я тоже надыбал
	if(location.search.length<2)
		location.assign(location.href+\'?id=\'+id);
	else if(location.search.match(/(\W)(id=)\d+/))
		location.assign(location.href.replace(/(\W)(id=)\d+/,\'$1$2\'+id))
	else
		location.assign(location.href+\'&id=\'+id)
});


Потому что получается что search может не быть - бНОПНЯ (то есть ?), search может быть и там может не быть id, search может быть и там может быть id. Блеать! На php я написал класс Get с ладонь размером, который генерит что хочешь get->id(31)->pid(999)->on('dd')->article(null)->page(2) // и все это можно прямо в строку воткнуть, __toString() выведет нормальный урл. Вызов типа article(null) это значит надо убить такой аргумент в урле.

Ну вот, неужели думаю придется разбирать эту хрень на js, ну понятно что в принципе там ничего сложного, но опять эти циклы, сбор-разбор и все ради одного id.

kostyanet 04.12.2014 14:09

Потому что на php есть parse_str и http_build_query. Поэтому с ладонь, ну еще есть array_filter(), хоть http_build_query() и сама не выводит аргументы у которых значение null.

Насчет амперсанда. Его может не быть в том смысле, что будет другой сепаратор. В php.ini где-то оно задается. Но все нормальные люди пользуются амперсандом и я туда же.

Aetae 04.12.2014 15:53

.replace(/(^|[&?])id=\d+/, '$1id=' + id)

kostyanet, замена твоей функции:
var search = location.search.replace(/[&?]id=\d*/, '')
location.search = search ? search + '&id=' + id : 'id=' + id;


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