2011-07-08 3 views
1

からパラメータを解析するために、私は正規表現との合計のnoobだと:私は、次の操作を実行するために、適切な正規表現を作成することはできませんハードしようとしていたが、正規表現がURL

  1. テイクのURLを、それが「?を持っているかどうかを確認続いて数字の桁数が変わります。
  2. が一致する場合は、「?」記号の後の番号を取得してください。
  3. は、この番号を別の番号と交換します。

それでは、私たちはこのURLを持っているとしましょう:

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

VERYはdummiedダウンアプローチ:

$('#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

を贅沢チェックサムはありません、エラーチェックなどwindow.locationまたは含む文字列を使用し、ここFromt必要に応じてURL。


機能(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とlookbehindアサーションは_between_文字に適用されます。この場合、疑問符(実際に存在する場合)と最初の数字の間に適用されます。 – ridgerunner

0

私は正規表現の専門家だが、私はあなたが無視するlookaroundを使用することができると思います最初のマッチ

+0

これは非常に簡単です。一致した値を() を使って分割することができます。 –

+0

Javascriptには見た目がありません。 – ridgerunner

+0

@ridgerunner or right、damn – ianbarker

3

にあなたの番号を与える必要があります

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

はこれを試してください:あなたは正規表現せずにこれを行うことができます

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

実際には、 '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'の両方で有効です。)また、数字の後ろにクエリパラメータ(または '#fragment')があるとどうなりますか? – ridgerunner

+0

Thx @ridgerunner。 OPは「それがあるかどうかを確認する」と言っていたので、私はこれらのシナリオを考慮しなかった。続いて数字が変わっていきます。彼の例は 'http://website.com/avatars/avatar.png?56'でした。しかし、合意すれば、より複雑なURLは何か他のものを必要とするでしょう。 –

関連する問題