Заменить регуляркой число после 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 заменить. Помогите кто понимает в регах как составить такую регу. Спасибо. |
Вот так вроде работает
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,
Рано радоваться, я лоханулся. Последний случай не работает, я сразу ен заметил:) Щас подумаю, как решить. |
В смысле я уже собирался на хэшкод идти жаловаться на javascript.ru
|
Не бывает таких вариантов! Всегда есть амперсанд, или ?, если в самом начале. Так что все работает пучком.
Я уже не первый кто замечает что программисты четко делятся на тех кто умеет писать реги, и кто вообще не умеет. Я несколько раз пытался освоить это шифрование и каждый следующий раз просто лез искать или подбирать варианты из готового. |
Цитата:
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] |
А, так вот оно как, надо было экранировать только спец-вопрос. Я так делал, ну, по аналогии, есть у меня похожие варианты в кодах, но забил и амперсанд обратным слешем и ничего не менялось. Ну то есть я делал похоже. Это одуреть можно всматриваться в эти черточки и буквочки, ну ладно, запишу и это на всякий случай.
Функция получилась все равно уродской. 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. |
Потому что на php есть parse_str и http_build_query. Поэтому с ладонь, ну еще есть array_filter(), хоть http_build_query() и сама не выводит аргументы у которых значение null.
Насчет амперсанда. Его может не быть в том смысле, что будет другой сепаратор. В php.ini где-то оно задается. Но все нормальные люди пользуются амперсандом и я туда же. |
.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. |