AndroidのEditTextでURL /ウェブサイト名を検証する方法は?


85

私は、入力、URLまたは単にウェブサイトの名前のように、撮りたいwww.google.comをからEditTextでAndroidで、ユーザーのクリックにButton提出する場合、またはEditTextフォーカスを失い、それは形式であるようにURL」には、検証する必要がありますwww.anyURL.com "..。

これどうやってするの?Androidで利用できる組み込み機能はありますか?

回答:


275

短い答え

パターンクラスでWEB_URLパターンを使用する

 Patterns.WEB_URL.matcher(potentialUrl).matches()

これは、返されたURLが有効である場合はTrueURLが無効の場合はfalse

長い答え

Android APIレベル8の時点で、WEB_URLパターンがあります。ソースを引用すると、「RFC3987のほとんどの部分と一致します」。より低いAPIレベルをターゲットにする場合は、ソースからパターンをコピーして、アプリケーションに含めることができます。パターンとマッチャーの使い方を知っていると思いますので、ここでは詳しく説明しません。

また、クラスURLUtilは、いくつかの便利なメソッドを提供します。

メソッドの説明はあまり複雑ではないため、ソースを調べて、どちらが目的に最も適しているかを判断するのがおそらく最善です。

検証チェックをトリガーするタイミングについては、複数の可能性があります。EditTextコールバック関数を使用できます。

または、TextWatcherを使用します。これが良いと思います。

以下のようにURLを検証するためにURLUtil使用しないでください

 URLUtil.isValidUrl(url)

「http://」のような文字列を有効なURLとして提供するため、これは正しくありません。


16
URLUtilのソースを見ると、isValidUrl()とisHttpUrl()は基本的にstartsWith( "http://")と同じなので、期待する結果が得られない可能性があるため、これらの使用には注意してください。WEB_URLパターンの使用は、URLの検証にはるかに適しています。
デイブ

URLUtil.isValidUrl(downloadImageEditText.getText()。toString());
ブラーイエス2015

1
ただし、ユーザー入力に関する限り、ユーザーは「http://」または「https://」を入力しようとせず、URLとしてwww.google.comまたはgoogle.comのようなものを書き込むだけです。しかし、これらのケースは上記のソリューションでは検証されていません。ソリューションにはテスターの認識も含める必要があると思います。
スリクリシュナ

1
注意:Patterns.WEB_URLは「localhost」URLを認識しません。
Artem Novikov 2016年

1
Patterns.WEB_URLは新しいドメイン名を認識しません。例:abc.xyz(プレフィックスとしてhttps://を使用)(アルファベットのWeb URL)
Chintan Shah 2018

22
/** 
* This is used to check the given URL is valid or not.
* @param url
* @return true if url is valid, false otherwise.
*/
private boolean isValidUrl(String url) {
    Pattern p = Patterns.WEB_URL;
    Matcher m = p.matcher(url.toLowerCase());
    return m.matches();
}

4
Web URLは小文字である必要があります。そうでない場合、パターンはfalseを返します。ちょうど掲示、それが誰かを助けるかもしれないので...
praveenb

上記のコードスニペットの@praveenbは、www.websiteが有効であり、.comまたは.inがないとtrueを返します。このシナリオの検証方法を教えてください。
ParthPatel19年

なぜ正確に小文字でなければならないのですか?「これが必要」と言うだけでなく、なぜ必要なのかを説明してください。
Carsten Hagemann

4

場合によっては、UnitTestで、の代わりにをNullPointerException使用します。PatternsCompatPatterns

fun isFullPath(potentialUrl: String): Boolean {
    return PatternsCompat.WEB_URL.matcher(potentialUrl.toLowerCase(Locale.CANADA)).matches()
}

また、このメソッドtrueを渡すと戻ることに気づきましたPhoto.jpg。私の期待はfalseです。したがって、上記の代わりに以下の方法を提案します。

fun isFullPath(potentialUrl: String): Boolean {
    try {
        URL(potentialUrl).toURI()
        return true
    } catch (e: Exception) {
        e.printStackTrace()
    }
    return false
}

これはちょうど私の日を作りました。ありがとうございました!
sparkly_frog

PatternsCompatを使用してテストを実行するためのヒントをありがとうございます。
Adi B

2

URLUtil.isValidUrlは、APIレベル1以降に存在するため、機能します。


10
あなたがそれのためのコードを見れば、これは正しい答えではないはずです。URL全体が有効であるということではなく、URLの初期スキームをチェックしているだけです。これはおそらく私が見た中で最悪のURL検証の1つです
マイク

1

あなたのウェブサイトの検証でこの正規表現を使用してください

String WebUrl = "^((ftp|http|https):\\/\\/)?(www.)?(?!.*(ftp|http|https|www.))[a-zA-Z0-9_-]+(\\.[a-zA-Z]+)+((\\/)[\\w#]+)*(\\/\\w+\\?[a-zA-Z0-9_]+=\\w+(&[a-zA-Z0-9_]+=\\w+)*)?$";


//TODO for website validation

private boolean isValidate() 
{

        String website = txtWebsite.getText().toString().trim();
        if (website.trim().length() > 0) {
            if (!website.matches(WebUrl)) {
                //validation msg
                return false;
            }
        }
        return true;

}

-4

または、古き良きものを使用することもできます Regex

Pattern urlRegex = Pattern.compile("((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(:[0-9]+)?|(?:ww‌​w.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?‌​(?:[\w]*))?)");

それPatterns.WEB_URLが悪いと言っているのではなく、一致するものと一致しないものを簡単にテストできるようにするだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.