Correspondance d'expression rationnelle d'URL la plus courte en JavaScript

16

Créez l'expression régulière la plus courte qui correspondra approximativement à une URL dans le texte lorsqu'elle est exécutée en JavaScript

Exemple:

"some text exampley.com".match(/your regular expression goes here/);

L'expression régulière doit

  • capturez toutes les URL valides pour http et https.
  • ne vous inquiétez pas de ne pas faire correspondre les chaînes de recherche d'URL qui ne sont pas réellement des URL valides comme super.awesome/cool
  • être valide lorsqu'il est exécuté en tant que regex JavaScript

Critères de test:

Rencontre:

Ne pas correspondre:

  • exemple
  • super cool
  • Bonjour
  • je peux
  • Bonjour.

Voici un test qui pourrait aider à clarifier un peu http://jsfiddle.net/MikeGrace/gsJyr/

Je m'excuse pour le manque de clarté, je n'avais pas réalisé à quel point les URL correspondantes étaient affreuses.

Mike Grace
la source
Ahgrrrr! Je manque mes privilèges d'édition! Si vous allez restreindre le jeu à une langue, vous devriez peut-être l'étiqueter avec cette langue.
dmckee --- chaton ex-modérateur
Qu'est-ce qui constitue un caractère URL valide? parce que je peux simplement utiliser \wpour tout. Vous attendez-vous à des références arrières pour différents composants URL?
Ming-Tang
1
"Un URI est une séquence de caractères d'un ensemble très limité, c'est-à-dire les lettres de l'alphabet latin de base, des chiffres et quelques caractères spéciaux", selon la RFC 2396 .
RunnerRick
Mike: Je suppose qu'il y a encore quelques précisions à apporter. Dans l'état actuel des choses, je peux simplement utiliser /:/comme expression régulière et faire correspondre des URI valides et ne pas faire correspondre tous vos exemples sur la liste »Pas de correspondance«. Tant que vous empruntez cette route, la question est simplement la suivante: quelle est l'expression régulière la plus courte qui ne correspondra à aucune des chaînes d'exemple mais qui interceptera toujours tous les URI.
Joey
1
Essayez simplement d'écrire un défi plus long avec plus de détails.

Réponses:

1
/.+\.\w\w.*/

ne correspond pas à 3 chaînes qu'il ne devrait pas, correspond à presque tout le reste;)
upd: il ne correspond toujours pas aux 5

www0z0k
la source
14

Celui-ci fonctionne:

var re = /(^|\s)((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)/gi;

/*
(^|\s)                            : ensure that we are not matching an url 
                                    embeded in an other string
(https?:\/\/)?                    : the http or https schemes (optional)
[\w-]+(\.[\w-]+)+\.?              : domain name with at least two components;
                                    allows a trailing dot
(:\d+)?                           : the port (optional)
(\/\S*)?                          : the path (optional)
*/

Réussit les tests sur http://jsfiddle.net/9BYdp/1/

Correspond également à:

  • example.com. (point de fin)
  • example.com:8080 (port)
Arnaud Le Blanc
la source
Douceur!!!!!!!
Mike Grace
2
Ne voudriez-vous pas aussi faire correspondre un nom d'hôte avec un seul composant (par exemple localhost)?
RunnerRick
Cela permet des espaces
brenjt
travaille pour moi. ty :)
STEEL
Fonctionne bien, mais pas pour les domaines avec des parties utilisateur / mot de passe, par exemplehttp://user:[email protected]/path
Radon8472
5

Cela ne fait évidemment pas ce que vous avez l'intention, mais cela répond à vos critères:

 /.*/
  • "correspond à toutes les URL valides pour http et https."

    oui, correspondra certainement.

  • "ne vous inquiétez pas de ne pas faire correspondre les chaînes de recherche d'URL qui ne sont pas réellement des URL valides comme 'super.awesome / cool'"

    oui, bien sûr, il y aura beaucoup de faux positifs, mais vous avez dit que cela n'avait pas d'importance.

  • être valide lorsqu'il est exécuté en tant que regex JavaScript

    bien sûr que les œufs fonctionnent comme vous le dites.

Si ce résultat n'est PAS une bonne réponse, alors vous devez être plus sélectif avec vos critères.

Pour être une règle qui fonctionne comme vous le souhaitez, vous devez faire besoin de mettre en œuvre un matcher conforme à la RFC complète et un adaptateur compatible RFC complet sera « souci de ne pas correspondre ».

Donc, en termes de "permis ne correspondant pas", vous devez spécifier exactement quels écarts par rapport au RFC sont autorisés.

Tout le reste, et tout cet exercice est une imposture, parce que les gens vont simplement écrire tout ce qui fonctionne pour eux, ou comment ils l'aiment, et sacrifier "avoir un sens" au profit d'être court (comme je l'ai fait).

Sur votre mise à jour

Le regex le plus naïf que je puisse trouver qui correspond (et capture) tous vos exemples collés jusqu'à présent est:

/(\S+\.[^/\s]+(\/\S+|\/|))/g;

Sa nature est assez simple et suppose que seules 3 formes de base sont possibles.

x.y
x.y/
x.y/z 

zpeut être quelque chose et non des espaces. xpeut être autre chose qu'un espace. ypeut être tout ce qui n'est ni un espace ni un caractère '/'.

Il y a beaucoup de choses qui seront valables pour cette règle, beaucoup, mais elles ressembleront au moins à un URI valide pour un humain, elles ne seront tout simplement pas compatibles avec les spécifications.

par exemple:

hello.0/1  # valid 
1.2/1 # valid 
muffins://¥.µ/€  # probably valid

Je pense que l'approche sensée consiste à extraire les éléments susceptibles d'être des URI, puis à les valider avec quelque chose de plus strict, j'essaie de trouver comment utiliser la classe URI des navigateurs pour les valider =).

Mais vous pouvez voir le raisonnement ci-dessus travailler sur cet exemple ici: http://jsfiddle.net/mHbXx/

Kent Fredric
la source
Il a changé la question, mais vous pouvez quand /:/même faire mieux avec même après la retouche :-)
Joey
Merci Mike =). Je ne souhaite pas me concurrencer de manière plus sérieuse, les autres suggestions sont plus utiles, je voulais juste signaler le problème avec la prémisse initiale afin que la qualité de la question puisse s'améliorer =)
Kent Fredric
Est-ce seulement moi ou est-ce "www .google .com" correspondant?
Schiavini
1
/https?\:\/\/\w+((\:\d+)?\/\S*)?/

Essayez ça.

J'inclus les barres obliques de début et de fin qui délimitent l'expression régulière, donc j'espère que cela ne nuit pas au nombre de mes personnages!

Ce modèle limite le protocole à http ou https, autorise un numéro de port facultatif, puis autorise tout caractère à l'exception des espaces.

RunnerRick
la source