2009-02-23 4 views
3

J'ai cherché haut et bas, mais ne peut pas trouver une réponse définitive à cela. Comme c'est souvent le cas avec les expressions rationnelles. Alors j'ai pensé que je demanderais ici. J'essaie de mettre en place une expression régulière que je peux utiliser en JavaScript pour remplacer toutes les instances d'URL et d'adresses e-mail (qui n'ont pas besoin d'être si strictes) avec des balises d'ancrage pointant vers elles.JavaScript Regexp pour envelopper les URL et les courriels dans les ancres

Évidemment, c'est quelque chose qui est généralement fait très simplement du côté serveur, mais dans ce cas, il est nécessaire de travailler avec du texte brut afin qu'une solution JavaScript élégante pour effectuer les remplacements à l'exécution soit parfaite.

problème Onl est, comme je l'ai déjà dit, j'ai une énorme expression régulière trou béant en forme dans mon ensemble de compétences :(

Je sais que l'un d'entre vous a la réponse à la pointe de vos doigts dans :)

Répondre

1

Pas une solution en conserve, mais this vous pointera dans la bonne direction. J'utilise Regex Coach pour construire et tester mes regexes. Vous pouvez trouver des exemples abondants d'expressions rationnelles pour les urls et les adresses e-mail en ligne.

4

Eh bien, à l'aveuglette en utilisant des expressions rationnelles de http://www.osix.net/modules/article/?id=586

var emailRegex = 
    new RegExp(
    '([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}' + 
    '\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.' + 
    ')+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)', 
    "gi"); 

var urlRegex = 
    new RegExp(
    '((https?://)' + 
    '?(([0-9a-z_!~*\'().&=+$%-]+:)?[0-9a-z_!~*\'().&=+$%-][email protected])?' + //[email protected] 
    '(([0-9]{1,3}\.){3}[0-9]{1,3}' + // IP- 199.194.52.184 
    '|' + // allows either IP or domain 
    '([0-9a-z_!~*\'()-]+\.)*' + // tertiary domain(s)- www. 
    '([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.' + // second level domain 
    '[a-z]{2,6})' + // first level domain- .com or .museum 
    '(:[0-9]{1,4})?' + // port number- :80 
    '((/?)|' + // a slash isn't required if there is no file name 
    '(/[0-9a-z_!~*\'().;?:@&=+$,%#-]+)+/?))', 
    "gi"); 

puis

text.replace(emailRegex, "<a href='mailto::$1'>$1</a>"); 

et

text.replace(urlRegex, "<a href='$1'>$1</a>"); 

pourrait travailler

+0

Légère modification de la première ligne de emailRegex: Déplacer \ - à la fin du contexte englobant (changer l'ordre). var emailRegex = nouvelle RegExp ( '([a-zA-Z0-9 _ \ \ -.] +) @ ((\ [[0-9] {1,3}'. + « \ [0 -9] {1,3} \. [0-9] {1,3} \.) | (([A-zA-Z0-9 \ -] + \. '+ ') +)) ([ a-zA-Z] {2,4} | [0-9] {1,3}) (\]?) ', "gi"); – albertpeiro

+0

Pour moi, il envelopper mon mot anglais, par exemple "home" – fdrv

0

Comme toujours, ce ("ce" étant " le traitement HTML avec regex ") va être difficile et sujet aux erreurs. Ce qui suit fonctionnera sur raisonnablement bien formé uniquement d'entrée, mais voici ce que je ferais:

  1. trouver l'élément que vous voulez traiter, prendre est innerHTML valeur de la propriété
  2. trouver itérativement tout ce qui déjà est une lien (/(<a\b.+?</a>/ig)
  3. sur cette base, couper votre chaîne en « ce n'est pas un lien » - et « ceci est un lien » -bits, annexant tous les à un tableau soigneusement orderd
  4. processus
  5. le " bits de non-liaison "(ceux qui ne commencent pas par "<a "), à la recherche de URL- ou par e-mail-adresse modèles
  6. wrap adresse à chaque que vous trouverez dans <a> balises
  7. join() le tableau en une chaîne
  8. définir la propriété innerHTML à votre nouvelle valeur

Je suis sûr Vous trouverez des exemples d'expressions régulières qui correspondent aux adresses de messagerie et aux URL. Prenez ceux qui vous conviennent le mieux et utilisez-les à l'étape 4.).

1

Voici un bon article pour les URL ...

http://www.codinghorror.com/blog/archives/001181.html

courriels sont plus direct car ils doivent se terminer par un .tld Vous n'avez pas besoin d'obtenir la fantaisie avec celui puisque vous n'êtes pas valider, correspondant juste, si du haut de ma tête ...

[^ \ s] + @ \ w [\ w -.] * [a-zA-Z] +

0

simple ajout d'un bit d'information par email regexps. la plupart des ils semblent ignorer que les noms de domaine peuvent avoir les caractères «åäö» en eux. Donc, si cela vous intéresse, assurez-vous que la solution que vous utilisez a åäöÅÄÖ dans la partie domaine de l'expression rationnelle.

Questions connexes