将字符串中的URL更改为可点击链接,同时更改其值

时间:2015-09-04 09:57:55

标签: javascript jquery

对于一个小小的webapp,我使用JS将字符串中的url更改为可点击的url,同时更改url以说“点击此处”#。然而问题是,如果我保持URl相同,而不将其更改为“点击此处”'一切正常。但如果我更改它,可点击链接会链接到错误页面:

  

未找到

     

请求的网址/client/http://www.google.com'   在此服务器上找不到target =' _blank'>点击此处。

以下是我使用的代码(无需更改为'点击此处')

 $('.discussion').ready(function(){

    $('.discussion #messages p').each(function(){

      var str = $(this).html();

        var regex = /(https?:\/\/([-\w\.]+)+(:\d+)?(\/([\w\/_\.]*(\?\S+)?)?)?)/ig

        var replaced_text = str.replace(regex, "<a href='$1' target='_blank'>$1</a>");

        $(this).html(replaced_text);


   });
});

这是我想要工作的那个,但却给出了错误:

$('.discussion').ready(function(){

    $('.discussion #messages p').each(function(){

      var str = $(this).html();

        var regex = /(https?:\/\/([-\w\.]+)+(:\d+)?(\/([\w\/_\.]*(\?\S+)?)?)?)/ig

        var replaced_text = str.replace(regex, "<a href='$1' target='_blank'>tap here</a>");

        $(this).html(replaced_text);


   });
});

[编辑],这是HTML

<ol class="discussion" scroll-bottom="replies">
    <div ng-class="getClass($index)" ng-repeat="reply in replies track by $index">
      <li ng-repeat="item in reply.text.replace('?','.').replace('!','.').split('. ') track by $index" class="fix-clutter">
        <div class="avatar">
          <img ng-src="{{reply.avatar}}">
        </div>

        <div id="messages" class="animated slideInUp">

          <p class="animated fadeInUp">{{item}}</p>

        </div>
       </li>
    </div>
  </ol>

1 个答案:

答案 0 :(得分:0)

我在此处复制并粘贴了您的代码:http://plnkr.co/edit/CK2vJdeIxtN1Bvt7Kce5?p=preview,其中包含以下HTML:

<div class="discussion">
  <div id="messages">
    <p>
      http://stackoverflow.com/questions/32395188/changing
    </p>
    <p>
      http://stackoverflow.com/questions/32395188/changing
    </p>
  </div>
</div>

在这个特定场景中,一切都运作良好。你可以粘贴你的HTML吗? 然而,正则表达式它无法正常工作。如果在URI上添加“破折号”,则正则表达式无法获取完整的URI,并且它会破坏破折号。

更新: 我再次检查了...问题是由正则表达式规则引起的90%。

另一种破坏的情况是当你已经在html上使用“href tag”作为下面代码的链接时:

<div class="discussion">
  <div id="messages">
    <p>
      <a href="http://stackoverflow.com/questions/32395188/changing'>LINK</a>
    </p>
  </div>
</div>