【问题标题】:Javascript - How to replace words inside page contentJavascript - 如何替换页面内容中的单词
【发布时间】:2016-06-19 17:11:35
【问题描述】:

所以我有一个大约 1,000 个单词的列表,如果它们出现在页面上,它们会被替换为某些内容。我尝试用正则表达式来做,所以对于千字中的每一个,我都会像这样替换内容:

    var pattern = new RegExp("(.*?)([^A-Za-z_/\-]+)("+title+")([^A-Za-z_\./\-]+)(.*?)","ig");

    content = content.replace( pattern, function replacer(contents,start,before,value,after,end) {

    var key = value.toLowerCase();

但是这种方法确实很慢。另一种方法是将页面内容拆分为单词,然后检查是否有任何部分等于任何关键字。问题是我有一千个关键字,所以在一个有 10,000 个单词的页面上,我必须遍历 10,000 X 1,000 个可能会使浏览器崩溃的项目。

有没有人知道在页面上替换单词的好方法?

【问题讨论】:

  • 至少有一部分与this answer相关,this answer的代码是用来创建Drumfinator Chrome插件的。 :-)
  • "问题是我有一千个关键字" 如果你可以预先构建 {keyword: 'value'} 散列整个操作将是 O(n) ,其中 n 是其中的单词数,这不是问题文本。
  • 假设不是每个单词都是唯一的,您可以索引单词,取唯一值,比较前 3,5 或 7 个字母并替换值,然后重建字符串。跨度>

标签: javascript regex substitution


【解决方案1】:

这很慢,因为对于每个单词,您都在再次测试整个内容。最好为任何单词创建一个正则表达式,然后在哈希中查找:

// Make your "dictionary" first:
var replacements = {
    "replace": "R",
    "this": "T",
    "etc": "..."
};

var content = "Should replace this with letters.";

var output = content.replace(/\w+/g, function replacer(word) {
    return replacements[word.toLowerCase()] || word;
});

console.log(output);

输出是:

Should R T with letters.

【讨论】:

  • 编辑:删除了 \b 东西:没有必要,因为 \w+ 无论如何都会从头到尾匹配单词。捕获组也不是。
  • 行得通!我现在需要弄清楚的一件事是,我怎样才能只匹配没有出现在

    标记之类的东西中的单词?

  • 为此,您可能必须遍历 DOM 并一次处理一个节点(除非它是不应处理的节点)。
猜你喜欢
  • 1970-01-01
  • 2014-05-19
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
  • 2012-10-15
  • 2011-05-22
  • 1970-01-01
相关资源
最近更新 更多