web-dev-qa-db-fra.com

Comment vérifier qu'une chaîne uri est valide

Comment vérifiez-vous qu'une chaîne uri est valide (que vous pouvez la transmettre au constructeur Uri)?

Jusqu'à présent, je n'ai que les éléments suivants, mais pour des raisons évidentes, je préférerais une méthode moins brute:

    Boolean IsValidUri(String uri)
    {
        try
        {
            new Uri(uri);
            return true;
        }
        catch
        {
            return false;
        }
    }

J'ai essayé Uri.IsWellFormedUriString mais il ne semble pas aimer tout ce que vous pouvez lancer sur le constructeur. Par exemple:

String test = @"C:\File.txt";
Console.WriteLine("Uri.IsWellFormedUriString says: {0}", Uri.IsWellFormedUriString(test, UriKind.RelativeOrAbsolute));
Console.WriteLine("IsValidUri says: {0}", IsValidUri(test));

La sortie sera:

Uri.IsWellFormedUriString says: False
IsValidUri says: True

Mise à jour/Réponse

Le constructeur Uri utilise le type absolu par défaut. Cela provoquait une différence lorsque j'ai essayé d'utiliser Uri.TryCreate et le constructeur. Vous obtenez le résultat attendu si vous faites correspondre l'UriKind pour le constructeur et TryCreate.

59
Manuel

Un URI bien formé implique la conformité avec certains RFC. Le chemin local dans votre exemple n'est pas conforme à ceux-ci. En savoir plus dans la documentation IsWellFormedUriString .

Un faux résultat de cette méthode n'implique pas que la classe Uri ne sera pas en mesure d'analyser l'entrée. Bien que l'entrée URI ne soit pas conforme à RFC, elle peut tout de même être un URI valide.

Mise à jour : Et pour répondre à votre question - comme le montre la documentation Uri, il existe une méthode statique appelée TryCreate = qui tentera exactement ce que vous voulez et retournera vrai ou faux (et l'instance réelle Uri si elle est vraie).

71
Franci Penov

Étant donné que la réponse acceptée ne fournit pas d'exemple explicite, voici un code pour valider les URI en C #:

Uri outUri;

if (Uri.TryCreate("ThisIsAnInvalidAbsoluteURI", UriKind.Absolute, out outUri)
   && (outUri.Scheme == Uri.UriSchemeHttp || outUri.Scheme == Uri.UriSchemeHttps))
{
    //Do something with your validated Absolute URI...
}
31
DiscDev

En supposant que nous ne voulons prendre en charge que les requêtes URI et HTTP absolues, voici une fonction qui fait ce que vous voulez:

public static bool IsValidURI(string uri)
{
    if (!Uri.IsWellFormedUriString(uri, UriKind.Absolute))
        return false;
    Uri tmp;
    if (!Uri.TryCreate(uri, UriKind.Absolute, out tmp))
        return false;
    return tmp.Scheme == Uri.UriSchemeHttp || tmp.Scheme == Uri.UriSchemeHttps;
}
7
cdiggins

Dans votre cas, l'argument uri est un chemin absolu qui fait référence à un emplacement de fichier, donc selon le doc de la méthode, il renvoie false. Se référer à this

0
Vijay Sirigiri