-1

例如,我在 JS 中有一个字符串

var str = "hello @something and @someone ok";

我想替换以@开头的字符,例如,我通过正则表达式匹配模式来做到这一点

str.replace(/@([^ ]+\s[^ ]+)/g, '<a href="'+link+'"> $& </a>')

假设字符串是var str = "hello @something";这样的,因为它搜索 @ 并用 the 替换它,<a href>但如果字符串是,var str = "hello @something and @someone ok";那么它首先用正确的 href 替换 @something ,然后用正确的 href 替换 @someone ,这最终改变了 href @something 到@someone 的href。我希望两个值的 href 不同。

4

1 回答 1

0

据我了解,您正在执行以下操作:

您存储一个包含多个@

var str = "hello @something and @someone ok";

和一个链接

var link = "stackoverflow.com";

然后你申请str.replace这个字符串

str = str.replace(/@([^ ]+\s[^ ]+)/g, '<a href="'+link+'"> $& </a>');

结果是

"hello <a href="stackoverflow.com"> @something </a> and <a href="stackoverflow.com"> @someone </a> ok"

接下来更改链接

link = "stackoverflow.com/questions/tagged/javascript";

str.replace再次应用于您的字符串

str = str.replace(/@([^ ]+\s[^ ]+)/g, '<a href="'+link+'"> $& </a>');

结果是

"hello <a href="stackoverflow.com"> <a href="stackoverflow.com/questions/tagged/javascript"> @something </a> </a> and <a href="stackoverflow.com"> <a href="stackoverflow.com/questions/tagged/javascript"> @someone </a> </a> ok"

那是你的问题。要修复它,您应该g从您的正则表达式中删除并@在替换中删除。然后每个字符串只会被正确的链接替换一次。你也应该改变你的正则表达式。我的建议是

var str = "hello @something and @someone ok";
var link = "stackoverflow.com";
str = str.replace(/@(\w+)/, '<a href="'+link+'"> $1 </a>');
link = "stackoverflow.com/questions/tagged/javascript";
str =  str.replace(/@(\w+)/, '<a href="'+link+'"> $1 </a>');
于 2018-10-24T08:06:30.870 回答