用JavaScript如何替换单词?

3
在我参与的一些论坛中,他们会用像垃圾邮件或已删除之类的东西来替换某些链接。例如:www.rapidshare.com/download/123 会自动变成 www.spam.com/download/123 或单词MONEY会变成BOSS。
这真的很让我烦恼,因为如果我想下载的话就必须手动改回来。有没有JavaScript可以解决这个问题,将www.spam.com替换回www.rapidshare.com?我的意思是在客户端上。
谢谢。
2个回答

3
如果这些网址在href属性中...
var replaceHrefAttributes = function (element, search, replace) {
    var nodes = element.getElementsByTagName('a');

    for (var i = 0, length = nodes.length; i < length; i++) {

        var node = nodes[i];

        if (node.href == undefined) {
            continue;
        }

        node.href = node.href.replace(new RegExp(search, 'g'), replace);
    }

}

您的使用可能类似于...
replaceHrefAttributes(document.body, 'www.spam.com', 'www.rapidshare.com');

如果这些URL是内联文本...

您可以迭代所有文本节点,使用replace()将任何字符串替换为另一个。

这是我编写的通用递归函数,可执行此操作...

var replaceText = function replaceText(element, search, replace) {
    var nodes = element.childNodes;

    for (var i = 0, length = nodes.length; i < length; i++) {

        var node = nodes[i];

        if (node.childNodes.length) {
            replaceText(node, search, replace);
            continue;
        }

        if (node.nodeType != 3) {
            continue;
        }

        node.data = node.data.replace(new RegExp(search, 'g'), replace);
    }

}

您的使用方式可能如下所示...
replaceText(document.body, 'www.spam.com', 'www.rapidshare.com');

如果您对代码的工作原理感到好奇,这里有一个简要的解释...
  1. 获取element的所有子节点。这将获取文本节点和元素。
  2. 遍历它们。
  3. 如果此节点具有自己的子节点,则使用循环中的element作为element再次调用该函数。continue因为我们不能修改它,因为它不是文本节点。
  4. 如果此节点的nodeType属性不是3(即文本节点),则continue,因为我们不能修改任何文本。
  5. 我们现在确定这是一个文本节点,所以替换文本。

您可以通过直接将search传递给它来使此函数更加灵活,从而允许它使用字符串或正则表达式搜索文本。


看起来不错,除了我认为 OP 想要替换链接的 hrefs。;o)(无论如何都很确定。) - user113716
1
@patrickdw:我想你可能是正确的,谢谢。我会进行修改 :) - alex
嗯...看着这个 if (node.href != undefined) { continue; },我想你是想写成 == undefined。但我现在有点困了... - user113716
continue似乎是多余的,为什么不将测试改为“node.nodeType == 3”,并在块中进行处理呢? - RobG
@One:抱歉,我没有。你有错误吗?确保你使用的是上面的代码(我一个小时前更新了它)。 - alex
显示剩余2条评论

0
var a = document.getElementsByTagName('a');
for (var i = 0, len = a.length ; i < len ; i += 1) {
    a.firstChild.nodeValue = a.href;
}

1
你假设所有的A元素都有一个firstChildhref属性,但事实并非如此。一个更好的方法是使用document.links集合。 - RobG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接