Question à propos de Validation d'URL avec la Regex
J'ai le texte suivant regex qui fait un travail remarquable urls correspondant:
((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)`
Cependant, il ne permet pas de gérer les url sans préfixe, c'est à dire. stackoverflow.com ou www.google.com ne correspondent pas. Quelqu'un sait comment je peux modifier cette expression à ne pas prendre soin si il y a un préfixe ou pas?
EDIT: ma question trop vague? Est-il besoin de plus de détails?
(((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\)))?[\w\d:#@%/;$()~_?\+-=\\\.&]*)
J'ai ajouté un ()? autour de l'protocoles comme Vinko Vrsalovic suggéré, mais maintenant, la regex va correspondre à presque n'importe quelle chaîne, tant qu'il est valide URL caractères.
Ma mise en œuvre de cette est que j'ai une base de données que j'ai à gérer le contenu, et il a un champ qui soit a la plaine du texte, un numéro de téléphone, une URL ou une adresse e-mail. Je cherchais un moyen facile de valider l'entrée afin que je puisse l'avoir correctement formaté, c'est à dire. la création d'ancrage des balises pour l'url/adresse mail, et le formatage du numéro de téléphone la façon dont j'ai les autres nombres mis en forme sur tout le site. Des suggestions?
Ce n'moyenne valide dans ce contexte? Que vous devez deviner qui est-il?
OriginalL'auteur Anders | 2008-10-22
Vous devez vous connecter pour publier un commentaire.
Ci-dessous la regex est de la magnifique Mastering Regular Expressions livre. Si vous n'êtes pas familier avec le gratuit espacement/commentaires mode, je vous suggère de vous familiariser avec elle.
Pour expliquer cette expression brièvement (pour une explication complète d'obtenir le livre) - les Url ont un ou plusieurs point que les parties séparées se terminant avec une liste limitée de finale de bits, ou un code de pays à deux lettres (.au royaume-uni .fr ...). En outre, les parties peuvent avoir des caractères alphanumériques ou des tirets '-', mais les traits d'union peuvent ne pas être le premier ou le dernier caractère de la pièces. Alors il y a peut être un numéro de port, puis le reste.
À extraire à partir du site web, allez à http://regex.info/listing.cgi?ed=3&p=207 C'est à partir de la page 207 de la 3ème édition.
Et la page dit "Copyright © 2008 Jeffrey Friedl" donc je ne suis pas sûr de ce que les conditions d'utilisation sont exactement, mais je m'attends à ce que si vous possédez le livre, vous pouvez l'utiliser alors ... j'espère que je ne suis pas enfreint les règles de la mettre ici.
OriginalL'auteur Hamish Downer
Si vous lisez l'article 5 de l'URL de la spécification (http://www.isi.edu/in-notes/rfc1738.txt) vous verrez que la syntaxe d'une URL est au minimum:
où le régime est de 1 ou plusieurs caractères et schemepart est 0 ou plusieurs caractères. Par conséquent, si vous n'avez pas un colon, vous n'avez pas une URL.
Cela dit, /users/ne se soucient pas si elles vous ai donné une url, pour eux, il ressemble. Voici donc ce que je fais:
AVANT la validation, si il n'y a pas une virgule, ajouter le préfixe http://, puis lancez-le par n'importe quel programme de validation que vous souhaitez. Cela s'avère tout légitime nom d'hôte (qui peut ne pas inclure de domaine info, après tout) en quelque chose qui ressemble à une URL.
(Presque) la seule règle pour la partie hôte est qu'il ne peut pas commencer par un chiffre si elle ne contient pas de points. Maintenant, il y a des validations spécifiques qui devraient être réalisées pour des projets spécifiques, dont aucun regexes donnés jusqu'à présent accomplir. Mais, spec conformité est probablement pas ce que vous voulez "valider". Par conséquent, une requête dns sur le nom de domaine partie peut être utile, mais si vous utilisez le même outil de résolution dans le même contexte que votre utilisateur, il ne va pas fonctionner dans tous les cas.
OriginalL'auteur caskey
Votre expression rationnelle correspond tout à commencer avec l'un de ces protocoles, y compris beaucoup de choses, cela ne peut pas être existante Url, si vous relaxer le protocole de la partie (ce qui en fait une option avec ?) ensuite, vous aurez juste être correspondant à peu près tout, y compris la chaîne vide.
En d'autres termes, il fait un excellent travail de correspondance des URLs, car il correspond presque tout ce qui commence par http://,https://,ftp:// et ainsi de suite. Eh bien, il correspond aussi à ftp:\\ et ms-help://, mais nous allons en tenir compte.
Il peut être judicieux, en fonction de l'utilisation réelle, parce que les autres regexp approche de listes d'autorisation valide domaines devient non maintenable assez rapidement, mais en faisant le protocole de la partie optionnelle n'a pas de sens.
Un exemple (avec de l'ambiance détendue de protocole de partie en place):
Donné votre modifier je vous suggère soit de rendre à l'utilisateur de sélectionner quel est-il ajout, en ajoutant un enum colonne, ou de créer une simple regex qui vais vérifier pour au moins un point, outre les caractères valides et peut-être certains domaines communs.
Une troisième alternative qui sera TRÈS LENT et ne doit être utilisé lors de la validation d'URL est vraiment VRAIMENT IMPORTANT est en fait accéder à l'URL et faire une TÊTE de demande sur elle, si vous obtenez un hôte ne trouve pas ou une erreur, vous savez qu'elle n'est pas valide. Pour les e-mails vous pouvez essayer et voir si le MX d'hôte et le port 25 ouvert. Si les deux échoue, il va être en texte brut. (Je ne dis pas que ce soit)
OriginalL'auteur Vinko Vrsalovic
Vous pouvez entourer le préfixe partie entre parenthèses et correspondre à 0 ou 1 occurrence
(((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+)?
Donc l'ensemble de la regex va devenir
(((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+)?[\w\d:#@%/;$()~_?\+-=\\\.&]*)
Le problème c'est qu'il va correspondre plus ou moins n'importe quel mot. Par exemple "test" sera aussi un match.
Où allez-vous utiliser les regex? Êtes-vous essayer de valider un nom de domaine ou êtes-vous essayer de trouver des noms d'hôtes à l'intérieur d'un paragraphe?
OriginalL'auteur marto
Suffit d'utiliser:
c'est à dire correspondre à tout.
Les choses que vous voulez faire correspondre sont juste des noms d'hôtes, pas d'URL (techniquement).
Il n'y a pas de structure, vous pouvez l'utiliser pour identifier de façon certaine les noms d'hôtes.
Vous pourriez peut-être regarder pour des choses qui se terminent par ".com" mais alors, vous allez manquer de tout .co.royaume-uni, net .org, etc.
Edit:
En d'autres termes: Si vous supprimez l'exigence que l'URL-comme les choses commencent avec un protocole que vous n'aurez pas quelque chose de correspondance.
Selon ce que vous êtes en utilisant l'expression régulière sur:
pas de remplacer la totalité de l'expression régulière. Ou mieux, il suffit de supprimer l'expression régulière et de traiter le tout sous forme d'une url.
OriginalL'auteur Douglas Leeder