使用正则表达式在正文中高效查找和替换模式
我想要做的是替换一个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');