J'utilise la fonction ci-dessous pour faire correspondre les URL à l'intérieur d'un texte donné et les remplacer pour les liens HTML. L'expression régulière fonctionne très bien, mais actuellement je ne remplace que le premier match.
Comment puis-je remplacer toutes les URL? Je suppose que je devrais utiliser la commande exec , mais je n'ai pas vraiment compris 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>");
}
la source
URL regexp from Component
ne soit pas commenté, une explication de ce qu'il fait serait utile.Autolinker.js
est très bien commenté et a des tests. Laurlize.js
bibliothèque liée à dans la réponse de Vebjorn Ljosa semble également fonctionnelle et bien entretenue, même si elle n'a pas de tests.Remplacement des URL par des liens (réponse au problème général)
L'expression régulière dans la question manque beaucoup de cas marginaux. 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 domaine internationaux, les nouveaux TLD comme
.museum
, les parenthèses et autres signes de ponctuation à l'intérieur et à la fin de l'URL, et de nombreux autres cas marginaux. Voir le billet de blog de Jeff Atwood The Problem With URLs pour une explication de certains des autres problèmes."Faire en sorte qu'une expression régulière remplace plus d'une correspondance" (réponse au problème spécifique)
Ajoutez un "g" à la fin de l'expression régulière pour activer la correspondance globale:
Mais cela ne résout que le problème de la question où l'expression régulière ne remplaçait que la première correspondance. N'utilisez pas ce code.
la source
J'ai apporté quelques petites modifications au code de Travis (juste pour éviter toute redéclaration inutile - mais cela fonctionne très bien pour mes besoins, donc beau travail!):
la source
[a-zA-Z]{2,6}
devrait lire quelque chose dans le sens de(?:[a-zA-Z]{2,6})+
afin de faire correspondre les noms de domaine plus complexes, par exemple [email protected].http://
ouwww
? Cela fonctionnera-t-il pour ce type d'URL?replacePattern3 = /(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})/gim;
celareplacePattern3 = /(\w+@[a-zA-Z_]+?(\.[a-zA-Z]{2,6})+)/gim;
corrige le problème mailto :)A fait quelques optimisations au
Linkify()
code de Travis ci-dessus. J'ai également corrigé un bug où les adresses e-mail avec des formats de type de sous-domaine ne correspondaient pas (par exemple [email protected]).De plus, j'ai changé l'implémentation pour prototyper la
String
classe afin que les éléments puissent être mis en correspondance comme suit:Quoi qu'il en soit, voici le script:
la source
+
noms d'utilisateur de messagerie, tels que[email protected]
. Je l'ai corrigé avec le modèle d'e-mail/[\w.+]+@[a-zA-Z_-]+?(?:\.[a-zA-Z]{2,6})+/gim
(notez le+
dans les premières parenthèses), mais je ne sais pas si cela casse autre chose.Merci, ceci était vraiment utile. Je voulais également quelque chose qui lierait des choses qui ressemblaient à une URL - comme exigence de base, il lierait quelque chose comme www.yahoo.com, même si le préfixe de protocole http: // n'était pas présent. Donc, fondamentalement, si "www". est présent, il le liera et supposera qu'il s'agit de http: //. Je voulais aussi que les e-mails deviennent des liens mailto :. EXEMPLE: www.yahoo.com serait converti en www.yahoo.com
Voici le code avec lequel je me suis retrouvé (combinaison de code de cette page et d'autres choses que j'ai trouvées en ligne et d'autres choses que j'ai faites moi-même):
Dans le 2e remplacement, la partie (^ | [^ /]) ne remplace www.wwhat.com que si elle n'est pas déjà préfixée par // - pour éviter la double liaison si une URL était déjà liée lors du premier remplacement. En outre, il est possible que www.wwhat.com soit au début de la chaîne, qui est la première condition "ou" dans cette partie de l'expression régulière.
Cela pourrait être intégré en tant que plugin jQuery comme Jesse P illustré ci-dessus - mais je voulais spécifiquement une fonction régulière qui n'agissait pas sur un élément DOM existant, parce que je prends le texte que j'ai et l'ajoute ensuite au DOM, et Je veux que le texte soit "lié" avant de l'ajouter, je passe donc le texte par cette fonction. Fonctionne très bien.
la source
L'identification des URL est délicate car elles sont souvent entourées de signes de ponctuation et parce que les utilisateurs n'utilisent souvent pas la forme complète de l'URL. De nombreuses fonctions JavaScript existent pour remplacer les URL par des hyperliens, mais je n'ai pas pu en trouver une qui fonctionne ainsi que le
urlize
filtre dans le framework Web basé sur Python Django. J'ai donc porté laurlize
fonction de Django en JavaScript:Un exemple:
Le deuxième argument, s'il est vrai, provoque
rel="nofollow"
l'insertion. Le troisième argument, s'il est vrai, échappe aux caractères qui ont une signification particulière en HTML. Voir le fichier README .la source
django_compatible
sur false, il gérera un peu mieux ce cas d'utilisation.urlize
ne prend pas correctement en charge les TLD (du moins pas le port JS sur GitHub). Une bibliothèque qui gère correctement les TLD est JavaScript Linkify de Ben Alman .J'ai apporté une modification à Roshambo String.linkify () à l'adresse emailAddressPattern pour reconnaître les adresses aaa.bbb. @ Ccc.ddd
la source
J'ai cherché sur google quelque chose de plus récent et j'ai rencontré celui-ci:
démo: http://jsfiddle.net/kachibito/hEgvc/1/
Fonctionne très bien pour les liens normaux.
la source
http://example.com/folder/folder/folder/
ouhttps://example.org/blah
etc. - juste votre format URL non fou typique qui correspondra à 95-99% des cas d'utilisation. J'utilise cela pour une zone administrative interne, donc je n'ai besoin de rien de fantaisiste pour attraper les cas de bord ou les liens de sécurité.Le meilleur script pour ce faire: http://benalman.com/projects/javascript-linkify-process-lin/
la source
Cette solution fonctionne comme la plupart des autres et utilise en fait la même expression régulière que l'une d'entre elles, mais au lieu de renvoyer une chaîne HTML, cela retournera un fragment de document contenant l'élément A et tous les nœuds de texte applicables.
Il y a quelques mises en garde, notamment avec les anciens supports IE et textContent.
voici une démo.
la source
Si vous devez afficher un lien plus court (uniquement le domaine), mais avec la même URL longue, vous pouvez essayer ma modification de la version de code de Sam Hasler publiée ci-dessus
la source
Reg Ex:
/(\b((https?|ftp|file):\/\/|(www))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]*)/ig
Voici quelques chaînes testées:
Remarque: Si vous ne voulez pas passer
www
comme valide, utilisez simplement ci-dessous reg ex:/(\b((https?|ftp|file):\/\/|(www))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig
la source
Les avertissements concernant la complexité de l'URI doivent être notés, mais la réponse simple à votre question est:
pour remplacer chaque correspondance, vous devez ajouter l'
/g
indicateur à la fin du RegEx:/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi
la source
exemple simple
la source
Rester simple! Dites ce que vous ne pouvez pas avoir plutôt que ce que vous pouvez avoir :)
Comme mentionné ci-dessus, les URL peuvent être assez complexes, surtout après le «?», Et toutes ne commencent pas par un «www». par exemple
maps.bing.com/something?key=!"£$%^*()&lat=65&lon&lon=20
Donc, plutôt que d'avoir une expression rationnelle complexe qui ne répondra pas à tous les cas extrêmes, et sera difficile à maintenir, que diriez-vous de celle beaucoup plus simple, qui fonctionne bien pour moi dans la pratique.
Rencontre
http(s):// (anything but a space)+
www. (anything but a space)+
Où `` n'importe quoi '' est
[^'"<>\s]
... fondamentalement une allumette gourmande, vous amenant à rencontrer un espace, un devis, un support d'angle ou une fin de ligneAussi:
N'oubliez pas de vérifier qu'il n'est pas déjà au format URL, par exemple le texte contient
href="..."
ousrc="..."
Ajouter ref = nofollow (si approprié)
Cette solution n'est pas aussi "bonne" que les bibliothèques mentionnées ci-dessus, mais elle est beaucoup plus simple et fonctionne bien dans la pratique.
la source
La détection correcte des URL avec la prise en charge des domaines internationaux et des caractères astraux n'est pas une chose triviale.
linkify-it
la bibliothèque construit des expressions rationnelles à partir de nombreuses conditions , et la taille finale est d'environ 6 kilo-octets :). Il est plus précis que toutes les bibliothèques, actuellement référencées dans la réponse acceptée.Voir la démo de Linkify-it pour vérifier en direct tous les cas de bord et tester les vôtres.
Si vous devez lier la source HTML, vous devez d'abord l'analyser et répéter chaque jeton de texte séparément.
la source
J'ai écrit une autre bibliothèque JavaScript, cela pourrait être mieux pour vous car elle est très sensible avec le moins de faux positifs possibles, rapide et de petite taille. Je suis actuellement en train de le maintenir activement, alors testez-le dans la page de démonstration et voyez comment cela fonctionnerait pour vous.
lien: https://github.com/alexcorvi/anchorme.js
la source
J'ai dû faire le contraire, et faire des liens html juste dans l'URL, mais j'ai modifié votre regex et cela fonctionne comme un charme, merci :)
la source
La détection des e-mails dans la réponse de Travitron ci-dessus ne fonctionnait pas pour moi, donc je l'ai étendue / remplacée par ce qui suit (code C #).
Cela permet des adresses e-mail telles que " pré[email protected] ".
la source
Après l'entrée de plusieurs sources, j'ai maintenant une solution qui fonctionne bien. Cela avait à voir avec l'écriture de votre propre code de remplacement.
Réponds .
Violon .
la source
Remplacez les URL dans le texte par des liens HTML, ignorez les URL dans une balise href / pre. https://github.com/JimLiu/auto-link
la source
Voici ma solution:
la source
Essayez la fonction ci-dessous:
alert(anchorify("Hola amigo! https://www.sharda.ac.in/academics/"));
la source
Essayez la solution ci-dessous
la source