Javascript替换regex剪切结果

Javascript replace regex cuts result

本文关键字:结果 regex 替换 Javascript      更新时间:2023-09-26

我已经尝试用一个相当复杂的正则表达式来解决一些简单的问题,比如用新内容替换长字符串的部分。任务是替换从其他地方提供的html中的超链接,并在输出之前通过自定义函数传递超链接。

function replaceHyperlinks(html){
    if(!source) return "";
    var str = source;
    // Modify <a> tag
    str = str.replace(/<a.*href="(.*?)".*>(.*?)<'/a>/gi, "<a onclick='"javascript:openURL('$1')'" href='"#'">$2</a>");
    return str;
}

更换工作似乎有条不紊。问题是,它只在第一场比赛中这样做,然后突然结束,第一场比赛后还会扔掉绳子的任何剩余部分。

我环顾四周,但从我所见,似乎没有人有这个问题。。。

您必须确保在每一次匹配中都使用"?",否则它会贪婪地匹配所有内容。

/<a.*href="(.*?)".*>(.*?)<'/a>/gi

有".*"而没有"?"会导致它吃掉模式的第一个和最后一个实例之间的所有内容。

拿这个:

<a href="/main">Main</a>  bunch of text or something <a href="/whatever">whatever</a>

现在,将其与该表达式匹配,添加括号显示匹配内容:

text = '<a href="/main">Main</a>  bunch of text or something <a href="/whatever">whatever</a>'
text.match(/<a(.*)href="(.*?)"(.*)>(.*?)<'/a>/i)
[
 "<a href="/main">Main</a>  bunch of text or something <a href="/whatever">whatever</a>",
 " href="/main">Main</a>  bunch of text or something <a ",
 "/whatever",
 "",
 "whatever"
]

忽略数组中的第一项,因为它是整个匹配项。第二项是第一组父母的火柴,你可以看到它抓得太多了。

text.match(/<a(.*?)href="(.*?)"(.*?)>(.*?)<'/a>/i)
["<a href="/main">Main</a>", " ", "/main", "", "Main"]

这就是你想要匹配的。