使用jquery或JS如何将字符串转换为链接?

时间:2012-10-10 14:03:22

标签: jquery dynamic-links

所以我有一段看起来像这样的HTML ......

<p>This is some copy. In this copy is the word hello</p>

我想使用jquery将单词hello转换为链接。

<p>This is some copy. In this copy is the word <a href="">hello</a></p>

这本身并不太难。我的问题是,如果这个词已经像下面的例子那样已经分开了......

<p>In this copy is the <a href="">word hello</a></p>

我不希望最终在链接中找到链接...

<p>In this copy is the <a href="">word <a href="">hello</a></a></p>

非常感谢任何帮助。

9 个答案:

答案 0 :(得分:3)

一个小正则表达式应该可以解决问题(更新,见下文):

$(document).ready(function(){
    var needle = 'hello';
    $('p').each(function(){
        var me = $(this),
            txt = me.html(),
            found = me.find(needle).length;
        if (found != -1) {
            txt = txt.replace(/(hello)(?!.*?<\/a>)/gi, '<a href="">$1</a>');
            me.html(txt);
        }
    });
});

小提琴:http://jsfiddle.net/G8rKw/

编辑:此版本效果更佳:

$(document).ready(function() {
    var needle = 'hello';
    $('p').each(function() {
        var me = $(this),
            txt = me.html(),
            found = me.find(needle).length;
        if (found != -1) {
            txt = txt.replace(/(hello)(?![^(<a.*?>).]*?<\/a>)/gi, '<a href="">$1</a>');
            me.html(txt);
        }
    });
});

小提琴:http://jsfiddle.net/G8rKw/3/

再次编辑:这次,“你好”作为变量传递给正则表达式

$(document).ready(function() {
    var needle = 'hello';
    $('p').each(function() {
        var me = $(this),
        txt = me.html(),
        found = me.find(needle).length,
        regex = new RegExp('(' + needle + ')(?![^(<a.*?>).]*?<\/a>)','gi');
        if (found != -1) {
            txt = txt.replace(regex, '<a href="">$1</a>');
            me.html(txt);
        }
    });
});

小提琴:http://jsfiddle.net/webrocker/MtM3s/

答案 1 :(得分:1)

你可以这样做,

<强> Live Demo

$('p').each(function(){    
    if($(this).find('a').length > 0) return;  
    lastSpaceIndex = $(this).text().lastIndexOf(' ');
    if(lastSpaceIndex  == -1)
        lastSpaceIndex = 0;    
    WordToReplace = $(this).text().substring(lastSpaceIndex);
    idx = $(this).text().lastIndexOf(WordToReplace);
    resultstring = $(this).text().substring(0, idx); 
    $(this).html(resultstring);
    $(this).append($( "<a href='#'>" + WordToReplace  + "</a>"));
});​

答案 2 :(得分:1)

此jQuery解决方案搜索特定术语,如果发现它后面跟着一个结束链接标记,则不会创建链接。

var searchTerm = "hello";

$('p:contains("' + searchTerm + '")').each(function(){
    var searchString = $(this).html();
    var searchIndex = searchString.indexOf(searchTerm);
    var startString = searchString.substr(0 , searchIndex);
    var endString = searchString.substr(searchIndex + searchTerm.length);
    if(endString.match(/<\/a>/g)) return;
    $(this).html(startString + "<a href=''>" + searchTerm + "</a>" + endString);
});​

这是a link的jsfiddle。

答案 3 :(得分:1)

写了一个简单的函数来检查替换文本是否被链接标记括起来。见下文,

DEMO: http://jsfiddle.net/wyUYb/4/

function changeToLink (sel, txt) {
   var regEx = new RegExp(txt, 'g');
   $.each($(sel), function (i, el) {
       var linkHTML = $(el).html();
       var idx = linkHTML.indexOf(txt);

       if (idx >= 0) {
           var t = linkHTML.substring(idx);
           //Fix for IE returning tag names in upper case http://stackoverflow.com/questions/2873326/convert-html-tag-to-lowercase
           t = t.replace(/<\/?[A-Z]+.*?>/g, function (m) { return m.toLowerCase(); })
           var closingA = t.indexOf('</a>');

           t = t.substring(0, closingA);
           if (closingA != -1) {
               t = t.substring(0, closingA); 
               if (t.indexOf('<a') < txt.length) {
                   return;
               }
           }               

           linkHTML = linkHTML.replace(regEx, '<a href="">' + txt + '</a>');
           $(el).html(linkHTML);
       }           
   });
}

即使您添加嵌套链接,您的浏览器也只需将其更改为两个链接即可。可能是因为使用嵌套链接是不合法的。见下文,

还在W3C中记录了Nested Links

  

12.2.2嵌套链接是非法的

     

A元素定义的链接和锚点不能嵌套;一个A.   element不得包含任何其他A元素。

     

由于DTD将LINK元素定义为空,因此LINK元素可以   也不要嵌套。

这就是为什么浏览器将嵌套链接作为单独的链接处理。

http://jsfiddle.net/H44jE/

请参见图片右下角的萤火虫检查。

enter image description here

答案 4 :(得分:0)

在将其转换为链接之前,您是否可以测试该单词的父元素?

if (parent != 'a') {
   // do your thing
}

(我不知道实际的jQuery会对此进行测试)

修改

以下内容将替换所有不包含链接的<p>元素中的单词。

可能无法完全按照要求运作,但希望指出您的方向

// get all p elements that contain the word hello but DO NOT have link in them
var elems = $('p:contains("hello")').not(':has(a)');


// replace instances of hello in the selected p elements
$(elems).html($(elems).html().replace(/(hello)/g,'<a href="new">$1</a>'));

Live Demo on JSBin

答案 5 :(得分:0)

尝试使用.replace jquery函数,如下所示:

var str = $('p').html().replace('(some)','(to some)');

答案 6 :(得分:0)

您需要jquery:not selector或.not()。

API文档很好地介绍了这一点,您应该可以选择内容,然后取消选择其中的链接。

http://api.jquery.com/not-selector/

答案 7 :(得分:0)

不是搜索单词并尝试查找其父级,而是搜索链接并检查其中包含的单词:

if($('a').text() === "hello"){
  //already linked
}else{
  //not linked
}

答案 8 :(得分:0)

首先保留单词,同时删除当前锚标记,如果有的话:

$('a').each(function() {
    $(this).replaceWith(this.childNodes);
 });

然后对需要使用的字符串执行替换

$('p').html($('p').text().replace('hello', '<a href="">hello</a>'));