04.12.2014, 12:31
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Заменить регуляркой число после 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 заменить.
Помогите кто понимает в регах как составить такую регу. Спасибо.
|
|
04.12.2014, 13:23
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
Вот так вроде работает
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]
особо не парился, ибо ты не достоин
Зы не не работает в последней строке, только что заметил
Последний раз редактировалось krutoy, 04.12.2014 в 13:29.
|
|
04.12.2014, 13:27
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Спасибо, в этой теме вы блеснули и спасли меня от позора. Еще раз спасибо. Плюсовать не могу, ибо прошлый минус еще не сгорел
|
|
04.12.2014, 13:31
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
kostyanet,
Рано радоваться, я лоханулся. Последний случай не работает, я сразу ен заметил Щас подумаю, как решить.
|
|
04.12.2014, 13:32
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
В смысле я уже собирался на хэшкод идти жаловаться на javascript.ru
|
|
04.12.2014, 13:34
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Не бывает таких вариантов! Всегда есть амперсанд, или ?, если в самом начале. Так что все работает пучком.
Я уже не первый кто замечает что программисты четко делятся на тех кто умеет писать реги, и кто вообще не умеет. Я несколько раз пытался освоить это шифрование и каждый следующий раз просто лез искать или подбирать варианты из готового.
Последний раз редактировалось kostyanet, 04.12.2014 в 13:36.
|
|
04.12.2014, 13:44
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
Сообщение от 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]
|
|
04.12.2014, 14:02
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
А, так вот оно как, надо было экранировать только спец-вопрос. Я так делал, ну, по аналогии, есть у меня похожие варианты в кодах, но забил и амперсанд обратным слешем и ничего не менялось. Ну то есть я делал похоже. Это одуреть можно всматриваться в эти черточки и буквочки, ну ладно, запишу и это на всякий случай.
Функция получилась все равно уродской.
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.
|
|
04.12.2014, 14:09
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Потому что на php есть parse_str и http_build_query. Поэтому с ладонь, ну еще есть array_filter(), хоть http_build_query() и сама не выводит аргументы у которых значение null.
Насчет амперсанда. Его может не быть в том смысле, что будет другой сепаратор. В php.ini где-то оно задается. Но все нормальные люди пользуются амперсандом и я туда же.
Последний раз редактировалось kostyanet, 04.12.2014 в 14:12.
|
|
04.12.2014, 15:53
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,587
|
|
.replace(/(^|[&?])id=\d+/, '$1id=' + id)
kostyanet, замена твоей функции:
var search = location.search.replace(/[&?]id=\d*/, '')
location.search = search ? search + '&id=' + id : 'id=' + id;
__________________
29375, 35
Последний раз редактировалось Aetae, 04.12.2014 в 16:10.
|
|
|
|