2010-05-19 5 views
1

J'essaie d'utiliser javascript pour trouver toutes les URL dans une zone de texte que la personne est en train de taper (onkeyup). Le problème que j'ai est de trouver une regex pour correspondre à l'URL entière, j'en ai besoin seulement pour correspondre à toutes les URL dans la zone de texte qui sont des URL complètes. Toutes les expressions regex existantes que je trouve par Google et par mon propre experiementing semblent correspondre dès que l'utilisateur a tapé la première partie du modèle. Ainsi, par exemple, si je tape et commence à taper http://w, tout d'un coup, cela correspondra.Javascript regex ne correspondant que l'URL entière en tapant

J'ai besoin de trouver une regex qui va correspondre et retourner un tableau de toutes les URLs dans la zone de texte, tout en ne correspondant pas à moins que la personne ait fini de taper l'URL complète. J'espère que cela a du sens!

Merci!

+7

http: // w est un URI complet. – Quentin

+0

ok, eh bien je voudrais seulement trouver des modèles comme: http://domain.com ou http://www.domain.com ou http://www.domain.com:8080 ou https://domain.com/whatever –

Répondre

3

Le commentaire de David est juste.

Comment pourriez-vous jamais déterminer que http://www.domain.com/whatever était une URL complète, mais http://www.domain.com/what ne l'était pas? Ou http://www.domain.com est terminée, mais http://www.domain.co n'est pas? (C'est, il y a un vrai site là-bas).

Vous pouvez interdire les noms d'hôte sans ., mais alors pourquoi ne pas http://to être valide? (Il est, il y a un vrai site là.) Pour ne pas mentionner http://テスト.

Il n'y a pas de réponse cohérente possible à la question « quel est le regex pour correspondre des choses qui ressemblent à URL me ».

+0

Et n'oubliez pas 'http: // localhost' –

+0

Je pense que je peux exiger qu'il y ait un espace (ou une ponctuation) après pour" surveiller "la zone de texte. Merci pour la perspicacité. –

+0

Attention, beaucoup de signes de ponctuation sont également valables dans les URL! par exemple. '.,!?)'. – bobince

0

Je fini par utiliser ce modèle:

var pattern = /((https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])(\s|\.\s|\,\s|\n|\r|\n\r)/ig; 

qui vérifie l'existence d'un espace ou un retour chariot (en liaison avec une virgule ou une période, je vais probablement ajouter un autre cas), puis j'enlève la période ou la virgule après.