preg_replace("/([&?]uid=)[^?&]*/",'$1173','http://localhost/mobile/index.php?c=wish&uid=181')//輸出:http://localhost/mobile/index.php?c=wish73
如上面$replacement ($1173)
表示的,php以為我要把$11
加上73
,但其實我是想讓 $1
加上173
,請問怎樣改才能符合我的預期?
剛剛在寫問題的時候突然想到把$replacement
改成$01
說不定可以,沒想到真可以了,現在是這樣'$01173'
另外,同樣的$replacement($1173)
放到js裡表現的結果卻是我預期的,那js裡想要$11
加上73
怎麼辦?
回複內容:
preg_replace("/([&?]uid=)[^?&]*/",'$1173','http://localhost/mobile/index.php?c=wish&uid=181')//輸出:http://localhost/mobile/index.php?c=wish73
如上面$replacement ($1173)
表示的,php以為我要把$11
加上73
,但其實我是想讓 $1
加上173
,請問怎樣改才能符合我的預期?
剛剛在寫問題的時候突然想到把$replacement
改成$01
說不定可以,沒想到真可以了,現在是這樣'$01173'
另外,同樣的$replacement($1173)
放到js裡表現的結果卻是我預期的,那js裡想要$11
加上73
怎麼辦?
試試$01173
?
JS只是比較智能一點,它發現你的正則裡面沒有11個分組,所以會把$1173
拆分為$1
和173
兩個部分。但是當分組數量達到11個以上時它也就會以能夠匹配到的最大的分組來替換了,比如:
'abcdefffgg'.replace(/(f+)fgg/, '$1173'); // abcdeff173,(替換的是第1個分組,ff)'abcdefffgg'.replace( /(f+)(a?)(a?)(a?)(a?)(a?)(a?)(a?)(a?)(a?)(fgg)/, '$1173'); // abcdefgg73(替換的是第11個分組,fgg)
要想在上面的第二個例子裡替換第一個分組,可以用$01173
,由於分組最大隻能到99,而01
已經滿了2位元,所以JS不會再去嘗試檢查第三位元。你可以在PHP裡試試這種方法,我沒測試,不知道可不可行。
至於你說的,想讓JS在不足11個分組的時候匹配$11
應該是做不到的。
在replace第二個參數裡面$實際上是告訴Regex引擎,接下來的是一個反向引用(有的語言或工具裡面也用\標識),是對Regex中匹配出來的組的引用,在你的例子裡面就是 ([&?]uid=)
所匹配出來的內容。
我對PHP不是很熟。
回答你的javascript的問題,在js裡面$1代表的第一個被匹配到的group。所以結果是正確。
如果你想要$11
這個字串的加上73
的話,用這個就可以了$$1173
詳細說明可參照這裡:http://deerchao.net/tutorials/regex/regex.htm#backreference