2010-01-20 5 views
0

Désolé de vous déranger à nouveau, mais voici mon dilemme.Extraire 1 ou plusieurs hyperliens du texte de paragraphe en Javascript en utilisant l'expression régulière

Il doit y avoir une "meilleure" expression régulière pour identifier le lien HTML d'un texte de paragraphe (il peut y avoir plus de 1 liens html dans le texte). Comment puis-je extraire tout le lien et l'ancrer dans javascript?

Ma tentative (javascript) est comme ceci:

var urlPattern = "(https?|ftp)://(www\\.)?(((([a-zA-Z0-9.-]+\\.){1,}[a-zA-Z]{2,4}|localhost))|((\\d{1,3}\\.){3}(\\d{1,3})))(:(\\d+))?(/([a-zA-Z0-9-._~!$&'()*+,;=:@/]|%[0-9A-F]{2})*)?(\\?([a-zA-Z0-9-._~!$&'()*+,;=:/[email protected]]|%[0-9A-F]{2})*)?(#([a-zA-Z0-9._-]|%[0-9A-F]{2})*)?"; 

function extractURLs(s) { 
    return s.match(new RegExp(urlPattern)); 
} 

//s is of type String 

//For testing... 
var text = "Check this video out http://ww w.youtube.com/watch?v=y3U3R3b1dOg or http://www.youtube.com/watch?v=sX6Vm0MoPCY"; 
alert(extractURLs(text)); 

(espaces sur lien hypertexte a été délibérément ajoutée ici pour permettre l'affichage de question SO). Résultat: je n'ai que le 1er lien hypertexte et non le second .... Est-ce que quelqu'un a fait quelque chose de similaire ou de meilleur que je peux utiliser?

Merci d'avance.

+0

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags Ceci devrait répondre à toutes vos questions. –

+0

Ne vous inquiétez pas ... J'ai lu cette douce poésie avant, mais Alsciende a fourni une réponse correcte pour moi. –

Répondre

2

Utilisez le modificateur "g":

function extractURLs(s) { 
    return s.match(new RegExp(urlPattern, "g")); 
} 
+0

Merci, cela a fonctionné! :-) –

0
var urlPattern = "(https?|ftp)://(www\\.)?(((([a-zA-Z0-9.-]+\\.){1,}[a-zA-Z]{2,4}|localhost))|((\\d{1,3}\\.){3}(\\d{1,3})))(:(\\d+))?(/([a-zA-Z0-9-._~!$&'()*+,;=:@/]|%[0-9A-F]{2})*)?(\\?([a-zA-Z0-9-._~!$&'()*+,;=:/[email protected]]|%[0-9A-F]{2})*)?(#([a-zA-Z0-9._-]|%[0-9A-F]{2})*)?"; 


function extractURLs(s) { 
    return s.match(new RegExp(urlPattern)); 
} 

var text = "Check this video out http://www.youtube.com/watch?v=y3U3R3b1dOg or http://www.youtube.com/watch?v=sX6Vm0MoPCY"; 
var results = extractURLs(text); 

alert(extractURLs(results[0] + ", " + results[1])); 
+0

Que je sais .... mais il ne retourne pas 2 liens sur le texte ... seulement le premier. –

+0

Regardez ma réponse éditée. J'ai modifié votre code. – stepanian

+0

résultats [1] me donne "http" de sorte que ne récupère pas le 2ème url de la chaîne de texte. –

0

Il est préférable de l'écrire comme,

var urlPattern = /(https?|ftp)://(www\\.)?(((([a-zA-Z0-9.-]+\\.){1,}[a-zA-Z]{2,4}|localhost))|((\\d{1,3}\\.){3}(\\d{1,3})))(:(\\d+))?(/([a-zA-Z0-9-._~!$&'()*+,;=:@/]|%[0-9A-F]{2})*)?(\\?([a-zA-Z0-9-._~!$&'()*+,;=:/[email protected]]|%[0-9A-F]{2})*)?(#([a-zA-Z0-9._-]|%[0-9A-F]{2})*)?/g; 

function extractURLs(s) { 
    return s.match(urlPattern); 
} 

Ici urlPattern est pré-compilé, plutôt que de compiler l'expression rationnelle à chaque fois que la La fonction est appelée, d'où résulte une performance optimale.

+0

True, mais extractURLs (...) n'est pas la seule fonction disponible, il existe des fonctions comme isValidURL (url) qui utilise urlPattern et d'autres qui sont terminées ou post-terminées avec d'autres expressions. –

+0

en fait votre urlPattern ne parviendra pas à compiler .... Solution: var urlPattern = /(https?|ftp)(((((([-zA-Z0-9.-] + \.) {1,} [a-zA-Z] {2,4} | localhost)) | ((\ d {1,3} \.) {3} (\ d {1,3}))) (: (d +))? (/ ([a-zA-Z0-9 -._ ~! $ & '() * +,; =: @ /] |% [0-9A-F] {2 }) *)? (\? ([a-zA-Z0-9 -._ ~ $ & '() * +,; =: /? @] |% [0-9A-F] {2}) *)? (# ([a-zA-Z0-9 ._-] |% [0-9A-F] {2}) *) ?; Vous devriez avoir supprimé le/g et remplacé le \\ par \ –

Questions connexes