搜索单词,替换为链接
我有这样的数组
var words = [ { word: 'Something', link: 'http://www.something.com' }, { word: 'Something Else', link: 'http://www.something.com/else' } ];
我想让它在页面上搜索单词并用链接替换它。 有没有一种有效的方法呢? 似乎可能是CPU饥饿。
对不起本来应该更多…
例如,它将使用类.message搜索每个元素。 然后找到其中的所有单词。
这个数组中也会有几百个
一个好的策略是:
1)构建一个对象,其键是要替换的短语,其值是用它们替换它们的链接。
2)在执行此操作时,构造一个可以匹配任何键的正则表达式
3)使用该正则表达式进行全局替换。
粗略的例子:
var replacementDict = { 'foo': 'http://www.foo.com/', 'bar': 'http://www.bar.net/' }; var theRegex = /\b(foo|bar)\b/g; theText.replace(theRegex, function(s, theWord) { return "" + theWord + ""; });
鉴于以下内容:
您可以使用以下内容:
//your array var words = [ { word: 'Something', link: 'http://www.something.com' }, { word: 'Something Else', link: 'http://www.something.com/else' } ]; //iterate the array $.each(words, function() { //find an element with class "message" that contains "word" (from array) $('.message:contains("' + this.word + '")') //substitute html with a nice anchor tag .html('https://stackoverflow.com/questions/1583303/search-for-words-replace-with-links/' + this.link + ''); } );
这个解决方案有一个直接的问题(在示例中也显示)。 如果您搜索Something的示例并且您发现Something beautiful ,则“contains”将匹配。
如果您想要严格的选择,您必须:
//for each array element $.each(words, function() { //store it ("this" is gonna become the dom element in the next function) var search = this; $('.message').each( function() { //if it's exactly the same if ($(this).text() === search.word) { //do your magic tricks $(this).html('https://stackoverflow.com/questions/1583303/search-for-words-replace-with-links/' + search.link + ''); } } ); } );
您可以选择是先迭代所有数组元素然后再遍历所有dom,还是反过来。 这也取决于你要搜索哪种“单词”(参见两个例子中的“为什么”)。
大警告:如果数组包含用户定义的内容,则必须先对其进行清理,然后才能将其置于元素的html中!
有可能做到这样的事情:
$('*:contains("string to find")');
这种方法的问题是“*”将返回包含字符串的所有元素,包括HTML,BODY等……之后你仍然需要在每个元素的文本节点中找到字符串,所以它可能是更容易去检查每个文本节点…
我建议你看看高亮插件已经做了一些非常类似于你想要的东西(而不是链接,它突出显示页面上的任何文字),但从源代码看起来很容易改变它。
如果你想在’a’标签中包含取消评论代码并在上面评论。 试试这个:
var words = [ { word: 'Something', link: 'http://www.something.com' }, { word: 'Something Else', link: 'http://www.something.com/else' }]; var changeWordsWithLink = function (words) { if(document.getElementById && document.getElementsByTagName) { var messages = document.getElementById('message'); if(messages) { for(i = 0; i < messages.length; i++){ for (j = 0; j < words.length; j++) { if(words[j].word == messages[i].innerHTML) { messages[i].innerHTML = words[j].link; //messages[i].innerHTML = wrapInATag(words[j].link, words[j].word); } } } } } } var wrapInATag = function(link, word) { return '' + word + ''; }