angularjs - 如何从正则表达式显示 url 提供商名称

标签 angularjs regex

我有这样的需求,

http://indianexpress.com/article/india/ram-nath-kovind-for-president-which-parties-support-his-candidature-and-how-the-scales-weigh-4712714/

现在显示整个链接,现在的要求是,仅显示 indianexpress(当我单击此链接时,它应该导航)

代码是:

     var detectUrls = function(value) {
          var retval = value;
          if(retval != null) {
            var urlRegex = /(((\b(https?|ftp|file):\/\/)|(www\.))[-A-Z0-9+&@#\/%?=~_|!:(),.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
            retval = value.replace(urlRegex, function (url,b,c) {
              var url2 = (c == 'www.') ?  'http://' +url : url;
              return '<a href="' + url2 + '" target="_blank">' + url2 + '</a>';
            });
          }
          return retval;
        };
$scope.post.postText = detectUrls($scope.post.postText);

我使用 url2 显示整个链接(上面)

最佳答案

我建议将正则表达式的各个部分重新分组,使其仅具有 2 个相关的捕获组,一个用于协议(protocol),另一个用于具有任何子域的域名。 模式是

  • ((?:\b(?:https?|ftp|file):\/\/)|www\.) - 第 1 组 (b) :
    • (?:\b(?:https?|ftp|file):\/\/) - 单词边界后跟 httphttpsftpfile,后跟 ://
    • | - 或
    • www\. - www. 子字符串
  • ([^\s\/]+) - 第 2 组 (c):除空格和 /< 之外的 1 个以上字符/里>
  • (?:\/?[-A-Z0-9+&@#\/%?=~_|!:(),.;]*[-A-Z0-9+&@ #\/%=~_|])? - 可选序列:
  • \/? - 1 或 0 /s
  • [-A-Z0-9+&@#\/%?=~_|!:(),.;]* - 字符类中定义的 0 个或多个字符<
  • [-A-Z0-9+&@#\/%=~_|] - 来自已定义类的 1 个单个字符。

然后,代码将如下所示

var detectUrls = function(value) {
      var retval = value;
      if(retval != null) {
        var urlRegex = /((?:\b(?:https?|ftp|file):\/\/)|www\.)([^\s\/]+)(?:\/?[-A-Z0-9+&@#\/%?=~_|!:(),.;]*[-A-Z0-9+&@#\/%=~_|])?/ig;
        retval = value.replace(urlRegex, function (url,b,c) {
          var url2 = (b == 'www.') ?  'http://' +url : url;
          return '<a href="' + url2 + '" target="_blank">' + c + '</a>';
        });
      }
      return retval;
    };
    
var res  = detectUrls('http://indianexpress.com/article/india/ram-nath-kovind-for-president-which-parties-support-his-candidature-and-how-the-scales-weigh-4712714/  www.google.com');
console.log(res);
document.body.innerHTML = res;

要仅显示名称,您需要稍微调整正则表达式,([^\s\/]+) 将更改为 (?:[^\s\/]*\.)?([^\s\/.]+)\.[^\s\/.]+:

  • (?:[^\s\/]*\.)? - 除空格之外的 0+ 个字符的可选序列, / 后跟 .
  • ([^\s\/.]+) - 第 2 组 (c) 将匹配 1+ 个除空格之外的字符,/.
  • \. - 一个.
  • [^\s\/.]+ - 除空格、/. 之外的 1 个以上字符。

var detectUrls = function(value) {
      var retval = value;
      if(retval != null) {
        var urlRegex = /((?:\b(?:https?|ftp|file):\/\/)|www\.)(?:[^\s\/]*\.)?([^\s\/.]+)\.[^\s\/.]+(?:\/?[-A-Z0-9+&@#\/%?=~_|!:(),.;]*[-A-Z0-9+&@#\/%=~_|])?/ig;
        retval = value.replace(urlRegex, function (url,b,c) {
          var url2 = (b == 'www.') ?  'http://' +url : url;
          return '<a href="' + url2 + '" target="_blank">' + c + '</a>';
        });
      }
      return retval;
    };
    
var res  = detectUrls('http://indianexpress.com/article/india/ram-nath-kovind-for-president-which-parties-support-his-candidature-and-how-the-scales-weigh-4712714/  www.google.com');
console.log(res);
document.body.innerHTML = res;

关于angularjs - 如何从正则表达式显示 url 提供商名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44647053/

相关文章:

javascript - AngularJS $scope.$apply() 困境

jquery - 在从 AngularJS 的 ng-view 指令返回的 HTML 元素上调用 jQuery 函数

mysql - 是否可以使用正则表达式替换对 mysql 表进行排序?

javascript - RegExp - 如何仅匹配边界内的单词?\b 不起作用

ruby - 如何从文本中删除 URL?

javascript - 从对象中解析名称并显示 - Angular Js

angularjs - 在控制台上显示 : Slow network is detected. 加载时将使用后备字体

javascript - Adobe Creative SDK Web 加载后显示小图像

javascript - Cypress - 如何使用 RegEx 进行负向预测?

javascript - 使用 Javascript 将棘手的字符串替换为 2 个字符串组合