2009-06-15 5 views

Répondre

1
(http:/)?(/[\w.]+)+/? 

correspond à ceux-ci, mais peut-être que vous aviez des conditions plus strictes à l'esprit?

2
(http:\/)?(\/[\w\.\-]+)+\/? 

Semblable à Alex's.

+0

hmmm, en dehors de votre Escaping plus approfondie, il me semble que vous correspondant « http :/'tout seul - tu es sûr de vouloir ça * au lieu de mon + là? –

+0

Celui-ci semble loin beaucoup trop gourmand. J'ai terminé avec environ 500k d'espaces. – FlySwat

+0

@Alex Bon appel. Édité. –

2

C'est une question délicate car il y a tellement de caractères valides dans les URL (avant qu'ils ne soient encodés en url).

Voici mon coup:

(http:/|https:/)?(/[^\s"'<>]+)+/? 

également similaire à Alex. Le seul problème que j'ai trouvé avec Alex, c'est que ça ne correspondrait pas à des choses comme des signes dièse, des tirets, des trucs comme ça. Alors que le mien va correspondre à tout cela. En fait, la seule chose qui l'empêche d'être trop gourmand est l'instruction de ne pas faire correspondre les espaces, les guillemets, les apostrophes ou les chevrons.

+0

Trop gourmand: http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> FlySwat

+0

Oh ... je l'ai juste mis à jour, peut-être que c'est mieux –

+0

Encore trop gourmand, tire le '/ a' de la fin '' s'il s'agissait d'un lien HTML – philfreo

8
(
    ((http|https|ftp)://([\w-\d]+\.)+[\w-\d]+){0,1} // Capture domain names or IP addresses 
    (/[\w~,;\-\./?%&+#=]*)    // Capture paths, including relative 
) 

Justification de cette réponse:

  1. L'ensemble est regroupé de sorte que vous pouvez choisir l'URL complète
  2. La partie de protocole est facultative, mais si elle est fournie, un nom d'hôte ou l'adresse IP doit également être fourni (les deux ont moins de caractères autorisés que le reste de l'URI).
  3. Le "/" au début est également facultatif. Les chemins peuvent être sous la forme "images/1.gif", qui sont relatifs au chemin actuel plutôt que par rapport au nom d'hôte.

:

Avertissements
  1. mailto et fichiers non pris en charge. URIs Les URL suivies par une période (comme à la fin d'une phrase sans guillemets) incluront la période de fin.
  2. En raison de # 3 ci-dessus, il va capturer toutes sortes de choses. Si vous pouvez vérifier que tous les chemins sont et non, vous pouvez ajouter un "/" à l'extérieur de la parenthèse et ainsi l'exiger.
  3. Si tous les URI sont dans les attributs HTML (A, LINK, IMG, etc.), vous pouvez cibler les URI de manière beaucoup plus précise en les capturant uniquement entre guillemets, ou du moins uniquement dans les balises HTML.

Modifier: whoops, problème de fermeture fixe paren.

+0

Vérifiez votre expression, même après avoir supprimé les commentaires qu'il ne compilera pas – FlySwat

+1

Il a une parenthèse manquante à la fin. (http | https | ftp): // ([\ w- \ d] + \.) + [\ w- \ d] +) {0,1} (/ [\ w ~,; \ - \ ./ ?% & + # =] *)) D'ailleurs, cela a été vérifié à http://regexhero.net/ - un grand gain de temps –

+0

Notez que cela échoue si les URL sont en HTML, comme le ' \ a' de la fin ' 'sont inclus – philfreo

0

Pas facile et peut-être vous finissez par avoir « trop URI » attrapée, mais qu'en est:

((http://|https://)([^/])+)*(/([^\s])*(/))(((\w)*\.[\w]{3,10})|(\w+))? 

Fondamentalement, vous avez deux groupes là-bas. Sur la définition du protocole. On cherche le répertoire et on cherche un fichier à la fin. Mais! cette approche est très limitée. Si vous avez besoin d'une vraie validation URI et! séparation (port, nom d'utilisateur, mot de passe, filtrer les caractères indésirables!) vous finirez probablement avec une expression plus complexe. Bonne chance!

Mise à jour:

Vous ne l'avez pas demandé cela, mais pour les gars qui viennent des moteurs de recherche qui veulent en savoir plus sur regex Je voudrais brancher ce programme gratuit j'ai utilisé pour cette tentative « The Regex Coach » (Non, non affilié).

+0

Cela semble être le plus proche de correspondre réellement ce que je veux, mais ce qui est" capturé "est généralement ju st "/" et pas l'URI entière. – FlySwat

+0

Parce que même www.google.com, cool.com ou www.test.us/test pourrait être considéré comme un URI valide d'un certain point de vue, je suggère l'expression suivante: ([^ \ s] + [/.] + [^\ s] +) Il échouera sur les phrases de construction régulières tant qu'il y aura un espace après. – merkuro

+0

Nope ... renvoie: '/ foo/bar"> baz philfreo

0

J'ai utilisé des groupes de capture de noms. Nous obtenons de meilleurs résultats lorsque le système est présent. Comme www.foo.com/bar ne correspondrait qu'à/bar.

(?: 
    (?:(?<scheme>https?|file)://) 
    (?<host>[^/]+) 
    (?<path>/(?:[^\s])+)? 
) 
| 
(?<path>/(?:[^\s])+) 

C'est ce que vous pouvez faire pour javascript

var result = text.match(/(?:(?:(https?|file):\/\/)([^\/]+)(\/(?:[^\s])+)?)|(\/(?:[^\s])+)/g); 

Les données de test

sadfasdf /foo/bar/ba090z.gif asdfasdf /foo/bar/ sadfasdf asdflkj; http://www.foo.com/foo/bar some stuff http://user:[email protected]:80/r?stuff%20stuff 

user:[email protected]:80/r?stuff%20stuff 
Questions connexes