2012-11-19 57 views
0

我无法理解为什么我的代码在我要替换三个完全相同的单词时不工作。比方说,如果输入的是“www.facebook.com www.facebook.com wwww.facebook.com”当替换两个以上相同的单词时,使用.match单词时,不能使用Javascript。替换

我的输出会是这样这不是我想要的

<div class="content" style="font-size:13px;"> 
<a href="www.facebook.com">www.facebook.com</a> 
<a href="&lt;a href=" www.facebook.com'=""> www.facebook.com</a>'&gt; www.facebook.com www.facebook.com 
</div> 

但如果我输入允许说“www.facebook.com www.google.com wwww.yahoo.com”我得到我想要的东西

<div class="content" style="font-size:13px;"> 
<a href="www.facebook.com">www.facebook.com</a> 
<a href=" www.google.com"> www.google.com</a> 
<a href="wwww.yahoo.com">wwww.yahoo.com</a> 
</div> 

什么我其实想做的是当用户输入在文本区域的链接,并提交它。代码将用锚标签替换匹配链接。

这是我的.js

var wordlink2 = /(^|[^\/])(www\.[\S]+(\b|$))/gim; 
var hyperlink2; 

hyperlink2 = content.match(wordlink2); 

var $item = $("#ClassroomCommentComment").val(); 


if (hyperlink2 != null) { 
    for (x = 0; x < hyperlink2.length; x++) { 
     var site2 = hyperlink2[x].toString(); 
     var z2 = $item.replace(hyperlink2[x], "<a href='" + site2 + "'>" + site2 + "</a>"); 
     $item = z2; 
    } 
}​ 

我已与此吹走。谁能帮我这个:(

只是一个额外的,这是我的功能更精确:

function checkSubmit() 
    { 
     var $item = $("#ClassroomCommentComment").val(); 
     var $cont = $("#FileFile").val(); 


     if($item == "") 
     { 
      return false; 
     } 
     else 
     { 
      //$("#ClassroomCommentComment").css('color', 'white'); 

      if (hyperlink != null) 
      { 
       for (x= 0; x<hyperlink.length; x++) 
       { 

        var site = hyperlink[x].toString(); 
        var z = $item.replace(hyperlink[x],"<a href='" + site + "'>" + site +"</a>"); 
        $item = z; 
       }  
      } 

      if (hyperlink2 != null) 
      {    
       for (x= 0; x<hyperlink2.length; x++) 
       { 
        var site2 = hyperlink2[x].toString(); 
        var z2 = $item.replace(hyperlink2[x],"<a href='" + site2 + "'>" + site2 +"</a>"); 
        $item = z2; 

       }  
      } 



      for (x=0; x<=arraycontroller; x++) 
      { 
       var n = $item.replace(fullnamewp[x],"<a href = 'http://www.classoncloud.org/" + userlink[x] + "'>" + fullnamewp[x] +"</a>"); 
       $item = n; 
       //$("#ClassroomCommentComment").val(n); 
      } 

      if (hash != null) 
      { 
       for (x= 0; x<hash.length; x++) 
       { 
        var new_item = hash[x].toString().substr(1).split("#"); 
        var b = $item.replace(hash[x],"<a href='http://www.classoncloud.org/results/" + new_item + "'>" + hash[x] +"</a>"); 
        $item = b; 
       } 
      } 

      arraycontroller = 0; 
      fullnamewp = []; 
      userlink = []; 


      var classroom_id = $("#ClassroomCommentClassroomId").val(); 
      var user_id = $("#ClassroomCommentUserId").val(); 
      var comment = $item; 
      var image = "<?php echo $profile_pic; ?>"; 
      var name = "<?php echo $current_user_name; ?>"; 




     $.ajax({ 
     type: "POST", 
     url: '/learns/classroom/', 
     data: "data[ClassroomComment][classroom_id]=" + classroom_id + "&data[ClassroomComment][user_id]=" + user_id + "&data[ClassroomComment][comment]=" + comment, 
     dataType: "html", 
     success: function(data){ 



     var parent_id = data; 



     $('#comment-list').prepend('<div class="comments"> <a href="'+user_id+'" class="image"><img src="'+image+'" width="50" height="50"> </a><a href="#" class="wall_delete" id='+parent_id+' style="display: none;"></a> <div class="name"> <a href="'+user_id+'" class="close">X</a><a href="#" style="font-size:13px;">'+name+'</a><div class="content" style="font-size:13px;">'+comment+'</div> <div class="time"><div class="star-count"></div><a class="my-star" href="#" id='+parent_id+'>myStar .</a><a class="click" href="#">Comment</a> 1 seconds&nbsp;ago </div></div>  <form id="LearnsClassroomForm" accept-charset="utf-8" method="post" action="/learns/classComment"><input type="hidden" name="data[ClassroomComment][parent_id]" action="classroom" value='+parent_id+' id="ClassroomCommentParentId"><input type="hidden" name="data[ClassroomComment][classroom_id]" action="classroom" value="'+classroom_id+'"id="ClassroomCommentClassroomId"><input type="hidden" name="data[ClassroomComment][user_id]" action="classroom" value="'+user_id+'" id="ClassroomCommentUserId"><div class="displaycomment"><textarea name="data[ClassroomComment][comment]" class="textarea" placeholder="Write comment here..." id="ClassroomCommentComment" style="overflow: hidden; word-wrap: break-word; resize: none; height: 18px;"></textarea> <input type="submit" value="Comment" class="submit" style=" margin-right:7px; margin-top:10px;"> </div> </form></div>'); 

      } 
     }); 


     $("#ClassroomCommentComment").val(""); 
     $("#ClassroomCommentComment").css('color', 'black'); 

     $($(this).parent().parent().find("textarea")).css("height","30px");  
     return false; 

     } 

    } 
+0

我们能不能看一看代码,您使用的是传递到函数? –

+0

一个http://jsfiddle.net可能不错 – gdoron

+0

我已经发布了它谢谢:D – electricfeel1979

回答

4

我认为你正在做这个复杂得多,你需要的.replace()方法接受一个正则表达式来指定哪些应及时更换,如果你设置g标志的正则表达式它全局替换所以,你可以用一个单一的呼叫所有超链接的适当变化replace如下:

var $item = $("#ClassroomCommentComment").val(); 
$item = $item.replace(/((^|[^\/])(www\.[\S]+(\b|$)))/gi, '<a href="$1">$1</a>'); 
// do something with $item 

演示:http://jsfiddle.net/7vcZd/1/

没有必要首先使用.match()方法才能使用那场比赛作为.replace()第一个参数的结果。

您的代码产生奇怪输出的原因是您将一个字符串作为第一个参数传递给.replace() - 当您这样做时,它不会执行全局替换,它只会替换第一个实例。由于您在循环中进行了相同的替换,因此第二次和以后的替换在第一次替换中添加的<a ...部分中。如果添加console.log($item)语句的循环,你会看到你与每个迭代发生的结束......

+0

谢谢我的朋友它的作品!剩下的一件事是我没有看到1美元的工作以及它来自哪里,尽管我可以对此进行研究。 console.log($ item)我将在调试我的一些代码时使用它^ _^ – electricfeel1979

+1

在基于正则表达式的替换中,'$ 1'给出第一个子匹配的值('$ 2'给出第二个,等等。)。在这种情况下,我将整个表达式用圆括号括起来,以便$ 1匹配整个事物。更多信息在[MDN的'.replace()'doco](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/replace)。 – nnnnnn

1

的方式替换下面的行正在被什么原因造成的问题:

$item.replace(hyperlink2[x],"<a href='" + site2 + "'>" + site2 +"</a>"); 

它的作用是在$item中搜索hyperlink2[x]的第一个案例,并将其替换为链接。

在你的www.facebook.com 3次的例子中,它总会用链接代替www.facebook.com的第一个实例。

要打破发生错误的位置,让我们通过for循环,看看每次发生什么,以content

之前进入for循环

www.facebook.com www.facebook.com www.facebook.com 

的第一互为作用后的for循环

<a href='www.facebook.com'>www.facebook.com</a> 
www.facebook.com www.facebook.com 

的第二互为作用后的for循环

<a href='<a href='www.facebook.com'>www.facebook.com</a> 
'>www.facebook.com</a> 
www.facebook.com www.facebook.com 

它这样做是因为它正在查找并替换www.facebook.com的第一个实例,但原始字符串现在已更改,并且该实例现在位于href =''中。

最好制作一个字符串并返回它,而不是使用replace。

像这样:

的Javascript

var content = "www.facebook.com www.facebook.com www.facebook.com"; 

var wordlink2 = /(^|[^\/])(www\.[\S]+(\b|$))/gim; 
var hyperlink2 = content.match(wordlink2); 

var returnString = ""; 

if (hyperlink2 !== null) { 
    for (x = 0; x < hyperlink2.length; x++) { 
     var site2 = hyperlink2[x].toString(); 
     returnString += "<a href='" + site2 + "'>" + site2 + "</a>\n"; 
    } 
} 

$("#ClassroomCommentComment").text(returnString); 

http://jsfiddle.net/RDkcc/1/

或者更好的是,NNNNNN的回答最好看。

1

从我以为这原来的问题是你想要的东西:http://jsfiddle.net/nb6SQ/6/

var wordlink2 = /(^|[^\/])(www\.[\S]+(\b|$))/gim; 
var items = $(".content a"); 
var repval = $("#replacetext").val(); 

items.each(function(i,el) { 
    var item = $(el); 
item.attr("href", item.attr("href").replace(wordlink2, repval)); 
item.text(item.text().replace(wordlink2, repval)); 
});