使用正则表达式在正文中高效查找和替换模式

我想要做的是替换一个url和模式,例如###http://www.google.com### ,链接包含一个标签,例如Go There

我面临的问题是这个url和模式可以出现在我的网页的任何地方,它的包含元素总是不同的 – 这就是我所做的。

 $('body').contents().each(function(){ // Find the pattern. var element = $(this); var go_link = element.text().match("###(.*)###"); // Replace the pattern with go there button. if(go_link && go_link[1] != '(.*)'){ var pattern = go_link[0]; var link = go_link[1]; element.html(element.html().replace(pattern,'Go There')); } }); 

这工作http://jsfiddle.net/84T9u/但我觉得它有点效率低,因为它必须遍历中的每个元素,并且我的网站的每个页面上可能有数百个这样的链接模式。

我已经开始考虑使用:contains()选择器,我已经在SO上找到了一些扩展此方法以允许使用正则表达式的答案,但是我不太了解:contains()方法是如何工作的。 它会更高效,还是在function上与我正在使用的.each()非常相似 – 迭代所有元素以找到所需的文本或模式?

您可以使用以下代码:

 $('body').contents().each(function(){ // Find the pattern. var element = $(this); if(element.html()){ element.html(element.html().replace(/###(.*)###/g,"Go There")); } }); 

或简单地说:

 $('body').html($('body').html().replace(/###(.*)###/g,"Go There")); 

不要迭代或使用任何繁重的XML方法,只需将HTML更改为字符串:

 str = str.replace(/###(https?:\/\/.*?)###/gi, 'Go There');