Как проверить URL-адрес в TextWatcher, а также сопоставить с пустой строкой

У меня есть TextWatcher, который проверяет правильность URL-адреса. URL-адрес действителен, если он соответствует формату URL-адреса, где «http», «https», «www» и т. д. являются необязательными. Это также допустимо, если это пустая строка. EditText отобразит сообщение об ошибке, если URL-адрес недействителен. Это моя текущая реализация:

private TextWatcher websiteLinkWatcher = new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        if(websiteLayout.getError() != null) websiteLayout.setErrorEnabled(false);
    }

    @Override
    public void afterTextChanged(Editable s) {
        String websiteFormat = "^(|https?:\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&:/~\\+#]*[\\w\\-\\@?^=%&/~\\+#])?){0,140}$";
        if(s.toString().trim().length() > 140 || !s.toString().matches(websiteFormat)) {
            Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    websiteLayout.setErrorEnabled(true);
                    websiteLayout.setError("The provided website is not valid.");
                }
            }, 2000);
            saveEnabled.setBackgroundColor(getResources().getColor(R.color.grey200));
            saveEnabled.setClickable(false);
            // disable
        }
        else {
            saveEnabled.setBackgroundColor(getResources().getColor(R.color.blue500));
            saveEnabled.setClickable(true);
            // enable
        }
        return;
    }
};

Регулярное выражение очень противоречиво. Его единственное преимущество в том, что он работает с пустой строкой (т.е. сообщение об ошибке не отображается). В настоящее время принимаются http://example.com, https://example.com, пустая строка. https://www.example.com иногда принимается или отклоняется. www.example.com и example.com отклоняются.


person Bargain23    schedule 03.01.2018    source источник


Ответы (1)


String pattern = "(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9]\.[^\s]{2,})";

Будет соответствовать следующим случаям

  • http://www.foufos.gr
  • https://www.foufos.gr
  • http://foufos.gr
  • http://www.foufos.gr/kino
  • http://www.t.co
  • http://t.co
  • http://werer.gr
  • www.foufos.gr
  • www.mp3.com
  • www.t.co

НЕ будет соответствовать следующему

  • www.foufos
  • http://www.foufos
  • http://foufos
  • www.mp3#.com
  • www.foufos-.gr
  • www.-foufos.gr

Что касается пустой строки, сначала проверьте, пуста ли она, а затем проверьте шаблон:

if(yourstring.length() == 0 ||  yourstring.matches(pattern)) {
  // do something
}else{
   // show validation warning
}

источник

person Misha Akopov    schedule 03.01.2018
comment
Сначала это работает, но когда я начинаю редактировать текст и удалять все, появляется сообщение об ошибке. Для пустых строк не должно быть сообщений об ошибках. - person Bargain23; 03.01.2018
comment
Я сомневаюсь в этом, в операторе if вы проверяете, пусто ли оно, действителен ли URL-адрес или соответствует ли шаблон. Как могла возникнуть ошибка при yourstring.length() == 0 проверке. Пожалуйста, проверьте оператор if, если у вас есть оператор NOT - ! . - person Misha Akopov; 03.01.2018
comment
@Bargain23 Я обновил оператор if, пожалуйста, посмотрите на него, когда вы должны показывать предупреждение - person Misha Akopov; 03.01.2018