регулярное выражение JavaScript для анализа URL-адресов без протокола - PullRequest
2 голосов
/ 26 сентября 2011
String.prototype.linkify = function() {
this.replace(/((ht|f)tp:\/\/)?([^:\/\s]+)\w+.(com|net|org)/gi, '<a href="$&">$&</a>')
}

с http://www.google.com <a href="http://yahoo.com" rel="nofollow">http://yahoo.com</a> www.facebook.com соответствует им всем, однако я хочу, чтобы в Facebook была добавлена ​​группа протоколов, если она не существует. Есть ли способ сделать это без двух .replace?

Ответы [ 2 ]

1 голос
/ 26 сентября 2011

Я бы сделал что-то вроде этого:

String.prototype.linkify = function () {
  return this.replace(/((?:ht|f)tp:\/\/)?([^:\/\s]+\w+\.(?:com|net|org))/gi, function (_, protocol, rest) {
    var url = (protocol || "http://") + rest
    return '<a href="' + url + '">' + url + '</a>'
  })
}

(Я исправил несколько других проблем с вашим кодом: вы пропустили return и сопоставляли период имени домена, используя . вместо \..)

И я предполагаю, что мне не нужно указывать, насколько плохо это будет соответствовать URL-адресам в целом, из-за ряда проблем с вашим шаблоном.

1 голос
/ 26 сентября 2011

Если вам на самом деле не нужно совпадать с URL-адресами FTP, вы можете просто предположить раздел «http://"» ссылки. Это регулярное выражение делает это, позволяя вам также использовать https.

this.replace(/(http(s)?:\/\/)?(([^:\/\s]+)\.(com|net|org))/gi,
                         '<a href="http$2://$3">http$2://$3</a>')

Я не уверен, каков ваш вариант использования, но я хотел бы отметить, что это регулярное выражение не будет работать на следующих URL:

Это потому, что вы используете несколько жестко запрограммированных слов (com, net, org) и не сопоставляете ни одного символа после домена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...