2011-07-08 139 views
1

解析参数我用正则表达式,总的小白,虽然我努力,我不能创建正确的正则表达式来执行以下操作:正则表达式从URL

  1. 取URL并检查是否有一个'? '之后是数字不同的数字。
  2. 如果匹配是正确的,则获得'?'符号后的数字
  3. 将该数字与其他数字进行交换。

所以我们可以说,我们有这个网址:

http://website.com/avatars/avatar.png?56

我们采取 '56' 并将其更改为 '57'。

我对搜索的正则表达式如下,我不知道这是否是正确的:

\?[0-9]+ 

但我不知道如何采取?了。我应该把它从字符串中扔掉,而忘记在这里使用正则表达式吗?然后替换部分是唯一剩下的部分。

+1

有没有使用正则表达式具体原因是什么?你可以使用'location'对象,分别使用'location.search'。 –

+0

你的正则表达式是一个好的。你只需要重新加入你拿出的'?'中。请参阅下面的答案。 – ridgerunner

回答

1

你原来的正则表达式将工作得很好,只是添加回到?你正在服用了像这样:

var newnum = 57; 
url = url.replace(/\?[0-9]+/, '?'+ newnum); 
0

非常空置向下的方法:

$('#parse').click(function(e){ 
    var fromUrl = $('#from-url').val(); 
    var newNum = parseInt($('#new-number').val(), 10); 

    var urlRE = /(?!\?)(\d+)$/; 
    if (urlRE.test(fromUrl)){ 
     $('#result').text(fromUrl.replace(urlRE, newNum)); 
    }else{ 
     $('#result').text('Invalid URL'); 
    } 
}); 

DEMO

有没有奢侈的检验和,错误检查等Fromt这里,使用window.location或包含字符串网址,如果需要。


的爆发给一个函数(demo):“?”

// Call this to replace the last digits with a new number within a url. 
function replaceNumber(url, newNumber){ 
    // regex to find (and replace) the numbers at the end. 
    var urlRE = /\?\d+$/; 

    // make sure the url end in a question mark (?) and 
    // any number of digits 
    if (urlRE.test(url)){ 
     // replace the ?<number> with ?<newNumber> 
     return url.replace(urlRE, '?'+newNumber); 
    } 

    // invalid URL (per regex) just return same result 
    return url; 
} 

alert(replaceNumber('http://website.com/avatars/avatar.png?56', 57)); 
+0

表达式'/(?!\?)(\ d +)$ /'相当于'/(\ d +)$ /'(负数的前瞻断言将在数字的位置为真) – ridgerunner

+0

@ridgerunner :他们想确认链接以问号**和**数字结尾。负面预测验证了这一点。 (除非我误解你在说什么) –

+0

不,负面的lookahead没有这样的事情。它是在第一个数字之前紧接的零宽度断言 - 它不验证第一个数字之前的字符是问号。请记住,前视和后视声明是在_between_个字符之间应用的,在这种情况下,问号(如果其实际存在)和第一个数字之间。 – ridgerunner

0

我不是正则表达式的专家,但我认为你可以使用一个lookaround忽略

(?<=?)([0-9]+) 

这应该给你在第一场比赛

+0

这是非常简单的,你可以使用() 拆分匹配的值在我的文章上面有一个例子... –

+0

Javascript没有向后看。 – ridgerunner

+0

@ridgerunner or right,damn – ianbarker

3

你的电话号码试试这个:

var url = "http://website.com/avatars/avatar.png?56"; 
var match = url.match(/\?(\d+)/); 
if(match != null) { 
    url = url.replace(match[1], "new number"); 
} 
+0

如果URL是:''http://website.com/path56/avatar.png?56“'会发生什么? – ridgerunner

+0

url被替换为http://website.com/path56/avatar.png?new号码 –

+0

实际上,no,'matches [1]'将会是''56“',replace语句实际上是:'url = url.replace('56',“new number”);'和URL值最终为:'website.com/pathnew number/avatar.png?56'。 – ridgerunner

0

你可以做到这一点没有正则表达式。

var newNum = "57"; 
var url = "http://website.com/avatars/avatar.png?56"; 
var sUrl = url.split('?'); 
var rUrl = sUrl[0] + "?" + newNum; 
alert(rUrl); 
  1. 拆分在?
  2. 此的URL返回一个数组。
  3. 将阵列中的第一项和?和新号码一起添加。

http://jsfiddle.net/jasongennaro/7dMur/

+0

如果有多个“?”字符怎么办? ('?'在'?query'和'#fragment'中都是有效的。)另外,如果在数字后面还有更多的查询参数(或##片段)呢? – ridgerunner

+0

Thx @ridgerunner。我没有考虑任何这些情况,因为OP说'检查它是否有?然后是数字不同的数字,他的例子是'http://website.com/avatars/avatar.png?56'我认为这是非常明确的切入点。但同意,更复杂的网址需要别的东西。 –