найти несколько ключевых слов в словаре Javascript - PullRequest
1 голос
/ 07 декабря 2011

Я пытаюсь выполнить поиск по словарю для некоторого контента, и мой подход пока что я могу искать только отдельные слова, потому что я использую метод split (''), разделяющий только пространство. Я только что наткнулся на засор Сорта, и мне было интересно, ребята, у вас есть какой-нибудь весомый вклад. например, если в моем словаре есть ключи, состоящие из двух слов. Как ниже

var  dictionary = { "Darth Vader" : "Bad Ass Father", "Luke": "Son of the Bad Ass",
"Skywalker" : "Last name of some Jedi Knights", "Luke SkyWalker" : "Son of the Bad Ass"} 

это код, который я получил до сих пор, и он работает, очевидно, для отдельных слов, но не для нескольких ключевых слов. getElementsByClassName - это функция, которая возвращает массив всех найденных классов.

var body = '<div class="activity-inner"> This is a test glossary body paragraph to test glossary highlight of the Star Wars vocabulary. like Luke Skywalker and Darth Vader, Luke and Skywalker. </div> <div class="activity-inner">Hello glossary again here Luke Skywalker Darth Vader</div>';
document.write( body);
var matches = getElementsByClassName("activity-inner");
for (int i = 0; i < matches.length; i++;) {
var content = matches[i].innerHTML;
document.write(content);
var  words = content.split(' ');



for (var j = 0; j < words.length; j++) {
var temp = words[j].replace(/[^\w\s]|_/g, "")
     .replace(/\s+/g, " ").toLowerCase();
 if (temp in dictionary) {
words[j] = "<span class='highlight' style='color:green;'>"+words[j]+"</span>";
}
document.write(words[j] +"<br />");



}
body = words.join(' ');
document.write( "<br /> <br />" + body);
}

Приведенный выше пример не сработает. Однако некоторые вещи в моем словаре будут такими. Как я должен идти об этом и, возможно, избежать дела, если это вообще возможно? Спасибо!

1 Ответ

3 голосов
/ 07 декабря 2011

Создайте RegEx, состоящий из всех ключей словаря (чтобы предотвратить повторную замену замены).Затем используйте String.replace(pattern, replace_function), как показано ниже.

Демонстрация: http://jsfiddle.net/Z7DqF/

// Example
var dictionary = { "Darth Vader" : "Bad Ass Father", "Luke": "Son of the Bad Ass",
"Skywalker" : "Last name of some Jedi Knights", "Luke SkyWalker" : "Son of the Bad Ass"}
    content = "....";

var pattern = [],
    key;
for (key in dictionary) {
    // Sanitize the key, and push it in the list
    pattern.push(key.replace(/([[^$.|?*+(){}])/g, '\\$1'));
}
pattern = "(?:" + pattern.join(")|(?:") + ")"; //Create pattern
pattern = new RegExp(pattern, "g");

// Walk through the string, and replace every occurrence of the matched tokens
content = content.replace(pattern, function(full_match){
    return dictionary[full_match];
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...