2008-09-17 13 views
2

Comment procéder pour repérer les adresses URI dans un bloc de texte?Comment faire correspondre les URI dans le texte?

L'idée est de transformer de telles séries de textes en liens. C'est assez simple à faire si l'on considère seulement les schémas http (s) et ftp (s); cependant, je devine que le problème général (considérant le tel, mailto et d'autres arrangements d'URI) est beaucoup plus compliqué (si c'est même possible).

Je préférerais une solution en C# si possible. Je vous remercie.

+0

Vous pouvez jeter un oeil au code source de [Regexp :: Common :: URI] (http://search.cpan.org/~abigail/Regexp -Common-2.122/lib/Regexp/Common/URI.pm). – cubex

+0

Une liste de [Schémas URI officiels IANA enregistrés] (http://en.wikipedia.org/wiki/URI_scheme#Official_IANA-registered_schemes) peut être trouvée dans Wikipedia. Je suis d'accord que la recherche sur le web pour une expression régulière premade pourrait être la meilleure idée. –

Répondre

0

Pour beaucoup de protocoles, vous pouvez simplement rechercher ": //" sans les guillemets. Je ne suis pas sûr des autres.

1

Que l'adresse URI soit ou non dépendante du contexte. En général, la seule chose qu'ils ont toujours en commun est qu'ils commencent "scheme_name:". Le nom du système peut être n'importe quoi (sous réserve de caractères légaux). Mais d'autres chaînes contiennent également des deux-points sans être des URI.

Vous devez donc décider quels schémas vous intéressent. Généralement, vous pouvez vous en sortir en recherchant "nom_du_génème:", suivi de caractères jusqu'à un espace, pour chaque schéma qui vous intéresse. Malheureusement, les URI peuvent contenir des espaces, donc s'ils sont incorporés dans un texte, ils sont potentiellement ambigus. Il n'y a rien que vous pouvez faire pour résoudre l'ambiguïté - la personne qui a écrit le texte devrait le réparer. Les URI peuvent être inclus en option dans <>. Cependant, la plupart des gens ne font pas cela, donc reconnaître que ce format ne sera qu'occasionnellement utile.

L'article Wikipedia pour URI répertorie les RFC pertinentes. [Modifier pour ajouter: utiliser des expressions régulières pour valider pleinement les URI est un cauchemar - même si vous en trouvez ou en créez un qui est correct, il sera très volumineux et difficile à commenter et à maintenir. Heureusement, si tout ce que vous faites est de mettre en évidence des liens, vous ne vous souciez probablement pas du faux positif, vous n'avez donc pas besoin de valider. Il suffit de chercher "http: //", "mailto: \ S * @", etc.]

0

Ce n'est pas facile à faire, si vous voulez aussi faire correspondre "quelque chose.tld", parce que le texte normal aura beaucoup d'instances de ce modèle, mais si vous voulez faire correspondre uniquement les URI qui commencent par un schéma, vous pouvez essayer cette expression régulière (désolé, je je ne sais pas comment le brancher en C#)

(http|https|ftp|mailto|tel):\S+[/a-zA-Z0-9] 

Vous pouvez n ajouter d'autres schémas, et il correspondra au schéma jusqu'au caractère espace blanc suivant, en tenant compte du fait que le dernier caractère n'est pas invalide (par exemple comme dans la chaîne très habituelle "http://www.example.com")

0

La perl regexp suivante devrait tirer le tour. Est-ce que C# a perl regexps?

/\w+://[\w][\w./]*/

6

regexs peut prouver un bon point de départ pour cela, bien que les URIs et les URL sont notoirement difficiles à correspondre avec un seul motif.

Pour illustrer, le plus simple des modèles semble assez compliqué (en Perl 5 notation):

\w+:\/{2}[\d\w-]+(\.[\d\w-]+)*(?:(?:\/[^\s/]*))*

Ce sélectionnne http://example.com/foo/bar-baz

et ftp://192.168.0.1/foo/file.txt

mais poserait des problèmes pour au moins ceux-ci:

  • mailto:[email protected] (pas de match - pas //, mais présente @)
  • ftp://192.168.0.1.2 (le match, mais trop de chiffres, il est donc pas un URI valide)
  • ftp://1000.120.0.1 (correspondance, mais les besoins d'adresse IP nombres compris entre 0 et 255, donc il n'y a pas un URI valide)
  • nonexistantscheme://obvious.false.positive
  • http://www.google.com/search?q=uri+regular+expression (le match, mais requête n'est pas Je pense que c'est un cas de la règle 80/20. Si vous voulez attraper la plupart des choses, alors je ferais comme suggéré de trouver une expression régulière décente si vous ne pouvez pas en écrire une vous-même.

Si vous examinez du texte provenant de sources assez contrôlées (par exemple générées par une machine), vous obtiendrez alors le meilleur plan d'action.

Si vous avez absolument besoin d'attraper chaque URI que vous rencontrez, et que vous regardez du texte dans la nature, alors je pense que je chercherais n'importe quel mot avec deux points dedans, par exemple. \s(\w:\S+)\s. Une fois que vous avez un candidat approprié pour un URI, passez-le à un vrai analyseur d'URI dans la classe URI de la bibliothèque que vous utilisez. Si vous êtes intéressé par pourquoi il est si difficile d'écrire un modèle d'URI, je suppose que la définition d'un URI est faite avec un Type-2 grammar, alors que les expressions régulières ne peuvent analyser que les langues de Type-3 grammars.

0

le URL Tool for Ubiquity effectue les opérations suivantes:

findURLs: function(text) { 
    var urls = []; 
    var matches = text.match(/(\S+\.{1}[^\s\,\.\!]+)/g); 
    if (matches) { 
     for each (var match in matches) { 
      urls.push(match); 
     } 
    } 
    return urls; 
}, 
Questions connexes