2011-09-26 6 views
2
String.prototype.linkify = function() { 
this.replace(/((ht|f)tp:\/\/)?([^:\/\s]+)\w+.(com|net|org)/gi, '<a href="$&">$&</a>') 
} 

avec http://www.google.com http://yahoo.com www.facebook.com il leur correspond à tous, mais je veux facebook à préfixé avec le groupe de protocole si elle n'existe pas. Y at-il un moyen de le faire sans faire deux .replace?javascript regex pour analyser urls sans protocole

Répondre

1

je ferais quelque chose comme ceci:

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>' 
    }) 
} 

(je fixe deux autres problèmes avec votre code. Vous manque une return et vous correspondant le délai de nom de domaine en utilisant . plutôt que \.)

Et je suppose que je n'ai pas besoin de souligner à quel point cela va mal correspondre à URL: s en général, en raison d'un certain nombre de problèmes avec votre modèle.

+0

: comment irait ton regex? aussi, pouvez-vous expliquer les paramètres dans la fonction anonyme dans remplacer? –

+1

Les paramètres sont simplement $ &, $ 1, $ 2. Mon idée d'un bon moyen de faire correspondre les URL en général est en dehors de la portée de cette question, car c'est en fait un problème assez difficile. Pour le dire simplement, cependant, je commencerais par une liste complète de tous les TLD, puis je ferais correspondre des choses se terminant par un TLD et des fluffs de chaque côté (c'est plus facile une fois que vous vous rendez compte du TLD). –

1

Si vous n'avez pas réellement besoin de faire correspondre les URL FTP, vous pouvez simplement supposer la section "http: //" du lien. Cette regex fait cela, tout en vous permettant d'utiliser également https.

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

Je ne suis pas sûr de ce que votre cas d'utilisation est, mais j'aimerais noter que cette regex échouera sur les urls suivantes:

Cette C'est parce que vous utilisez peu de tlds codés en dur (com, net, org), et ne correspondent à aucun caractère après le domaine.

+0

Solution astucieuse pour vous assurer de saisir https selon les besoins. – Asmor