欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

javascript - 正则替换replace中$1的用法

程序员文章站 2022-06-11 18:24:24
...
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拆分为$1173两个部分。但是当分组数量达到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第二个参数里面$实际上是告诉正则表达式引擎,接下来的是一个反向引用(有的语言或工具里面也用\标识),是对正则表达式中匹配出来的组的引用,在你的例子里面就是 ([&?]uid=)所匹配出来的内容。

我对PHP不是很熟。
回答你的javascript的问题,在js里面$1代表的第一个被匹配到的group。所以结果是正确。

如果你想要$11这个字符串的加上73的话,用这个就可以了$$1173

详细说明可参照这里:http://deerchao.net/tutorials/regex/regex.htm#backreference

相关标签: php javascript