Comment remplacer les Url plaine avec des liens?
Je suis l'aide de la fonction ci-dessous pour des Url à l'intérieur d'un texte donné et de les remplacer par des liens HTML. L'expression régulière est génial de travailler, mais pour l'instant je ne suis que le remplacement du premier match.
Comment je peux remplacer toutes les URL? Je suppose que je devrais être à l'aide de la exec de commande, mais je n'ai pas vraiment comprendre comment le faire.
function replaceURLWithHTMLLinks(text) {
var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/i;
return text.replace(exp,"<a href='$1'>$1</a>");
}
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, rouler votre propre regexp pour analyser les Url est un terrible idée. Vous devez imaginer que c'est un problème assez commun que quelqu'un a écrit, de débogage et testé une bibliothèque pour elle, selon les Rfc. Les uri sont complexes - découvrez le code pour analyser les URL dans Node.js et la page de Wikipedia sur Modèles d'URI.
Il y a une tonne de bord des cas quand il s'agit de l'analyse d'Url: internationales des noms de domaine, réel (
.museum
) vs inexistante (.etc
) Tld, bizarre ponctuation y compris entre parenthèses, les signes de ponctuation à la fin de l'URL, IPV6 noms d'hôtes etc.J'ai regardé une tonne de les bibliothèques, et il y a un peu de peine de l'utiliser malgré quelques inconvénients:
href
attribut à l'intérieur de l'ancre () balises"). Je vais jeté quelques tests à quand un démo devient disponible.Bibliothèques que j'ai rapidement disqualifié pour cette tâche:
Si vous insistez sur une expression régulière, le plus complet est le URL regexp de Composant, bien qu'il faussement détecter certains inexistante deux lettres Tld en le regardant.
URL regexp from Component
n'est pas commenté, une explication de ce qu'il est en train de faire serait utile.Autolinker.js
est commentée très bien et a des tests. Leurlize.js
de la bibliothèque liés à la dans les Vebjorn Ljosa réponse regarde aussi plein de fonctionnalités et bien entretenues, bien qu'il ne dispose pas de tests.Linkified.linkify('text that might include a url')
Remplacer les Url avec des liens (Réponse à la problématique Générale)
L'expression régulière dans la question manque beaucoup de bord des cas. Lors de la détection d'Url, il est toujours préférable d'utiliser une bibliothèque spécialisée, qui gère les noms de domaines internationaux, les nouveaux Tld comme
.museum
, les parenthèses et les autres signes de ponctuation à l'intérieur et à la fin de l'URL, et de nombreux autres cas de bord. Voir le Jeff Atwood blog de Le Problème Avec Les Url pour une explication de certains des autres problèmes."Faire une expression régulière remplacer plus de un match" (Réponse à la problématique spécifique)
Ajouter un "g" à la fin de l'expression régulière pour permettre d'appariement globale:
Mais qui ne résout le problème dans la question " d'où l'expression régulière était seulement le remplacement du premier match. Ne pas utiliser ce code.
J'ai fait quelques petites modifications à Travis code (juste pour éviter redeclaration - mais ça fonctionne très bien pour mes besoins, donc de nice job!!!):
[a-zA-Z]{2,6}
devrait lire quelque chose le long des lignes de(?:[a-zA-Z]{2,6})+
afin de match plus compliqué noms de domaine, c'est à dire [email protected].http://
ouwww
? Sera-ce de travailler pour ce genre d'Url?replacePattern3 = /(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})/gim;
avec cettereplacePattern3 = /(\w+@[a-zA-Z_]+?(\.[a-zA-Z]{2,6})+)/gim;
qui résout le mailto problème 🙂http://[email protected]
<br/>
tag. comment pourrait-il être résolu?*
dans l'URL je crois que c'est autorisé. Il peut être corrigé en ajoutant\*
.Fait quelques optimisations à Travis
Linkify()
code ci-dessus. J'ai aussi corrigé un bug où les adresses e-mail avec un sous-domaine de type formats ne serait pas adapté (c'est à dire [email protected]).En plus, j'ai changé la mise en œuvre des prototypes de la
String
classe de sorte que les éléments peuvent être assortis de la sorte:De toute façon, voici le script:
+
dans le courriel, noms d'utilisateur, tels que[email protected]
. Je l'ai fixée avec e-mail motif/[\w.+]+@[a-zA-Z_-]+?(?:\.[a-zA-Z]{2,6})+/gim
(note de l'+
dans la première entre parenthèses), mais je ne sais pas si ça casse quelque chose d'autre.Merci, cela a été très utile. Je voulais aussi quelque chose qui permettrait de relier les choses qui ressemblait à une URL, comme une exigence de base, il avait un lien de quelque chose comme http://www.yahoo.com même si le protocole http://préfixe n'était pas présent. Donc en gros, si le "www" est présent, il va le lier et d'assumer c'est http://. Je voulais aussi e-mails à tourner dans les liens mailto:. EXEMPLE: http://www.yahoo.com serait converti à http://www.yahoo.com
Voici le code que j'ai fini avec (combinaison de code à partir de cette page, et d'autres trucs que j'ai trouvé en ligne, et d'autres trucs que j'ai fait sur mon propre):
Dans le 2ème remplacer, le (^|[^/]) est un remplacement http://www.whatever.com si c'est pas déjà le préfixe //-- afin d'éviter une double liaison si une URL a déjà été liée à la première remplacer. Aussi, il est possible que http://www.whatever.com peut-être au début de la chaîne, qui est la première condition "ou" dans la partie de l'expression régulière.
Ceci pourrait être intégré comme un plugin jQuery que Jesse P illustré ci-dessus-mais j'ai souhaité spécifiquement une fonction régulière qui n'agissait pas sur un élément du DOM, parce que je prends tout le texte que j'ai et puis l'ajouter au DOM, et je veux que le texte soit "linkified" avant que je ajouter, donc j'ai passer le texte par le biais de cette fonction. Fonctionne très bien.
L'identification des Url est difficile, car ils sont souvent entourés par des signes de ponctuation et parce que, souvent, les utilisateurs de ne pas utiliser la forme complète de l'URL. De nombreuses fonctions JavaScript existent pour remplacer les Url avec des hyperliens, mais j'ai été incapable d'en trouver un qui fonctionne aussi bien que la
urlize
filtre Python-web basé sur le framework Django. J'ai donc porté Djangourlize
fonction JavaScript:Un exemple:
Le deuxième argument, si la valeur est true, les causes
à être inséré. Le troisième argument, s'il est vrai, s'échappe les caractères qui ont une signification particulière dans le code HTML. Voir le fichier README.
django_compatible
à false, il prendra en charge que les cas d'utilisation un peu mieux.urlize
ne prend pas en charge les Tld correctement (au moins pas le JS port sur GitHub). Une bibliothèque poignées de Tld correctement Ben Alman JavaScript Linkify.J'ai fait un changement de Roshambo Chaîne.linkify() à la emailAddressPattern à reconnaître [email protected] adresses
J'ai cherché sur google pour quelque chose de plus récent et couru à travers celui-ci:
démo: http://jsfiddle.net/kachibito/hEgvc/1/
Fonctionne vraiment bien pour les liens normaux.
http://example.com/folder/folder/folder/
ouhttps://example.org/blah
etc - juste votre typique non-fou format de l'URL qui correspond à 95% à 99% de cas d'utilisation là-bas. Je me sers de ce pour l'administration intérieure de la zone, donc je n'ai pas besoin de rien de fantaisie pour attraper bord-cas ou hashlinks.Le meilleur scénario pour ce faire:
http://benalman.com/projects/javascript-linkify-process-lin/
Cette solution fonctionne comme beaucoup d'autres, et, en fait, utilise la même expression régulière comme l'un d'entre eux, cependant au lieu de renvoyer une Chaîne HTML ce sera le retour d'un fragment de document contenant l'élément et tous les nœuds de texte.
Il y a quelques mises en garde, à savoir avec les anciens IE et textContent de soutien.
ici est une démo.
Si vous avez besoin de montrer courtes (de domaine), mais avec la même URL, vous pouvez tenter ma modification de Sam Hasler la version en code affiché ci-dessus
Les avertissements à propos de l'URI de la complexité doit être noté, mais la réponse simple à votre question est:
Remplacer chaque match, vous devez ajouter le
/g
drapeau à la fin de la RegEx:/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi
Reg Ex:
/(\b((https?|ftp|file):\/\/|(www))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]*)/ig
Ci-dessous sont quelques-uns testé chaîne:
Remarque: Si vous ne voulez pas passer
www
comme valide une juste utilisation ci-dessous reg ex:/(\b((https?|ftp|file):\/\/|(www))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig
Keep it simple! Dire ce que l'on ne peut pas avoir, plutôt que ce que vous pouvez avoir 🙂
Comme mentionné ci-dessus, les Url peuvent être très complexes, surtout après le '?', et pas tous d'entre eux commencent avec un " www.", par exemple
maps.bing.com/something?key=!"£$%^*()&lat=65&lon&lon=20
Donc, plutôt que d'avoir un complexe regex que l'habitude de répondre à tous les cas de bord, et sera difficile à maintenir, comment à ce sujet beaucoup plus simple, qui fonctionne bien pour moi dans la pratique.
Match
http(s)://(anything but a space)+
www. (anything but a space)+
Où "n'importe quoi" est
[^'"<>\s]
... en gros un gourmand match, faisant de vous rencontrer un espace, devis, équerre de fixation, ou à la fin de la ligne
Aussi:
N'oubliez pas de vérifier qu'il n'est pas déjà dans le format de l'URL, par exemple, le texte contient
href="..."
ousrc="..."
Ajouter ref=nofollow (le cas échéant)
Cette solution n'est pas aussi "bon" que les bibliothèques mentionnées ci-dessus, mais est beaucoup plus simple, et fonctionne bien dans la pratique.
Corriger la détection d'URL avec des domaines internationaux & astral le support des caractères n'est pas chose banale.
linkify-it
bibliothèque construit regex de de nombreuses conditions, et la taille finale est d'environ 6 kilo-octets 🙂 . C'est plus précis que tous les libs, actuellement référence accepté de répondre.Voir linkify-il de démonstration de vérifier en direct tous les cas de bord et de tester vos proches.
Si vous avez besoin de linkify source HTML, vous devez l'analyser d'abord, et de parcourir chaque texte jeton séparément.
J'ai écrit encore une autre librairie JavaScript, il pourrait être mieux pour vous car il est très sensible avec le moins de faux positifs, rapide et de petite taille. Je suis actuellement activement de le maintenir de sorte s'il vous plaît ne le tester dans la page de démonstration et de voir comment il pourrait fonctionner pour vous.
lien: https://github.com/alexcorvi/anchorme.js
J'ai eu à faire le contraire, et de faire des liens html dans l'URL, mais j'ai modifié votre regex et il fonctionne comme un charme, merci 🙂
L'e-mail de détection dans Travitron la réponse ci-dessus ne fonctionne pas pour moi, j'ai donc prolongé ou remplacé par le texte suivant (code C#).
Cela permet d'adresses e-mail comme "[email protected]".
Après l'entrée en provenance de plusieurs sources, j'ai maintenant une solution qui fonctionne bien. Il avait à faire avec l'écriture de votre propre code de remplacement.
Réponse.
Violon.
Remplacer les Url dans le texte avec les liens HTML, ignorer l'Url dans un href/pre tag.
https://github.com/JimLiu/auto-link
Voici ma solution:
Essayer le dessous de la fonction :
alert(anchorify("Hola amigo! https://www.sharda.ac.in/academics/"));
Essayer Ci-Dessous La Solution
exemple simple