簡體   English   中英

Dart / Flutter - 驗證 URL 的字符串

[英]Dart / Flutter - Validating a string for URL

我正在嘗試創建一個系統,在該系統中我可以驗證一個字符串以檢查它是否是 url。 ( https://www.google.com/ )

我找到了 flutter package驗證器,但這與 dart 2 不兼容,因此與我的代碼不兼容。

同樣命名,我還發現了驗證器package 但我似乎無法讓它與我的代碼一起正常工作,因為它會引發以下錯誤; (希望你喜歡我的項目名稱;)

Because every version of flutter_test from sdk depends on test 1.3.0 
and every version of validators depends on test ^1.3.3, flutter_test from sdk is incompatible with validators.
So, because gucci depends on both validators ^1.0.0+1 and flutter_test any from sdk, version solving failed.
Unable to reload your application because "flutter packages get" failed to update package dependencies.
Exception: pub get failed (1)

如果您可以找到validators的修復程序,使其不會引發此錯誤並因此與我的代碼一起正常工作,或者建議另一種驗證字符串以符合 URL 的方法,那就太好了。

謝謝

編輯- 我的pubspec.yaml文件

name: gucci
description: A new Flutter project.

dependencies:
  flutter:
    sdk: flutter

  cupertino_icons:
  barcode_scan:
  gradient_app_bar:
  url_launcher:
  validate: ^1.7.0

dev_dependencies:
  flutter_test:
    sdk: flutter

  fonts:
    - family: PlayfairDisplay
      fonts:
        - asset: fonts/PlayfairDisplay-BoldItalic.ttf

    - family: Kanit
      fonts:
        - asset: fonts/Kanit-ExtraBoldItalic.ttf

    - family: Poppins
      fonts:
        - asset: fonts/Poppins-BoldItalic.ttf

    - family: PoppinsLightItalic
      fonts:
        - asset: fonts/Poppins-LightItalic.ttf

    - family: PoppinsMediumItalic
      fonts:
        - asset: fonts/Poppins-MediumItalic.ttf

要檢查有效的 URL 字符串,您只需使用Uri.parse()如下所示。

bool _validURL = Uri.parse(_adVertData.webLink).isAbsolute;

只需檢查_validURL的值

Uri.tryParse(mystring)?.hasAbsolutePath ?? false;

一些示例結果:

網址 結果
'https://stackoverflow.com/questions/52975739/dart-flutter-validating-a-string-for-url' 真的
asd 錯誤的
asd:asd 錯誤的
%EMPTY_STRING% 錯誤的
google.nl 錯誤的
https: 錯誤的
https:// 錯誤的
https://a 錯誤的
https://a/ 真的
var urlPattern = r"(https?|http)://([-A-Z0-9.]+)(/[-A-Z0-9+&@#/%=~_|!:,.;]*)?(\?[A-Z0-9+&@#/%=~_|!:‌​,.;]*)?";
var match = new RegExp(urlPattern, caseSensitive: false).firstMatch('https://www.google.com');

您也可以使用正則表達式。

我使用了下面的方法。 根據您的記錄,所有有效的 URL 都需要有一個主機(例如 google.com)。 如果 URL 沒有主機,它會返回一個空字符串(不是未定義或 null)。

  bool isURLValid = Uri.parse('https://google.com/').host.isNotEmpty;

正如一些人已經報道的那樣,使用 .isAbsolute 將諸如“http:”之類的 URL 標記為有效的 URL,而這些 URL 不是。

出於某種原因, validators包需要 Flutter 測試庫的最新版本,而不是留給應用程序處理。 也許有一個很好的理由(即他們正在使用一項新功能)。

Flutter 引擎內部需要特定版本的 flutter_test 庫(這就是為什么指定它的版本通常不是一個好主意)。 所以要解決這個問題,你必須通過運行flutter upgrade來升級你的顫振。 如果你已經使用了你所在頻道的最新版本,你可能需要運行flutter channel devflutter channel master來切換到更新頻率更高的頻道(實際上是分支)。

我大部分時間都在dev分支/頻道上運行,雖然它偶爾會出現問題,但它不會發生很多。 如果可能的話,我建議不要使用主分支。

使用RegEx進行驗證

String hasValidUrl(String value) {
   String pattern = r'(http|https)://[\w-]+(\.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?';
   RegExp regExp = new RegExp(pattern);
   if (value.length == 0) {
        return 'Please enter url';
   }
   else if (!regExp.hasMatch(value)) {
     return 'Please enter valid url';
   }
   return null;
}  

使用內置包進行驗證

final Uri uri = Uri.tryParse(value);
if (!uri.hasAbsolutePath) {
     return 'Please enter valid url';
}

如果你想要一些特殊情況,比如你必須驗證deepLink ,那么 RegEx 練習是最好的。

對於 RegExp,如果要在字符串中查找 URL,可以使用這個。

r'^((?:.|\n)*?)((http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)([-A-Z0-9.]+)(/[-A-Z0-9+&@#/%=~_|!:,.;]*)?(\?[A-Z0-9+&@#/%=~_|!:‌​,.;]*)?)'

當您突出顯示字符串中的 URL 時,可以使用它。 例如,在聊天應用程序中,您可以突出顯示已發送聊天消息中的 URL。 這將驗證 google.com、 https ://google.com、http: //google.com全部。

我正在使用這種方式來驗證 URL。 在您的 TextFormField 中使用此驗證器。 這里你的 url 應該從 www 開始。

validator: (website) {
                      String pattern =
                          r'^((?:.|\n)*?)((http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)([-A-Z0-9.]+)(/[-A-Z0-9+&@#/%=~_|!:,.;]*)?(\?[A-Z0-9+&@#/%=~_|!:‌​,.;]*)?)';
                      RegExp regExp = RegExp(pattern);
                      if (website.isEmpty) {
                        return "Please enter your website";
                      } else if (!(regExp.hasMatch(website))) {
                        return "Website Url must be started from www";
                      } else {
                        return null;
                      }
                    },
TextEditingController urlController = TextEditingController();
String urlData = '';
static final GlobalKey<FormFieldState<String>> _orderFromkey =
GlobalKey<FormFieldState<String>>(); 

@override Widget build(BuildContext context) { return SafeArea( child: Scaffold( resizeToAvoidBottomInset: false,

        body: Column(
          children: [
            appBar(label: appName),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: TextFormField(
                key: _orderFromkey,
                controller: urlController,
                validator: (value) {
                  String patttern =  r"((https?:www\.)|(https?:\/\/)|(www\.))[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9]{1,6}(\/[-a-zA-Z0-9()@:%_\+.~#?&\/=]*)?";
                  RegExp regExp = new RegExp(patttern);
                if (!regExp.hasMatch(value!)) {
                    return 'Please enter valid URL';
                  }
                },




                decoration: InputDecoration(

                    fillColor: appColor,
                    labelText: "url",
                    labelStyle: new TextStyle(color: appColor),
                    contentPadding: EdgeInsets.only(left: 10, right: 10),
                    enabledBorder: UnderlineInputBorder(
                      borderSide: BorderSide(color: appColor),
                    ),
                    focusedBorder: UnderlineInputBorder(
                      borderSide: BorderSide(color: black),
                    ),
                    hintText: 'Enter Your URL'),
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: InkWell(
                onTap: () {
                  print('_orderFromkey: ${_orderFromkey}');
                  final FormFieldState<String>? form =
                      _orderFromkey.currentState;
                  if (form!.validate()) {
                    urlData = urlController.text;
                    Get.toNamed('/showQr', arguments: urlData);
                    print('text : ${urlData}');
                  } else {
                    // _autoValidation = true;
                  }
                },
                child: Container(
                  width: ScreenSize.size.width * 0.6,
                  height: ScreenSize.size.height * 0.1,
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(10),
                    color: appColor,
                  ),
                  child: const Align(
                      alignment: Alignment.center,
                      child: Text(
                        'Submit',
                        style: TextStyle(
                            fontSize: 20,
                            color: white,
                            fontWeight: FontWeight.w700),
                        textAlign: TextAlign.center,
                      )),
                ),
              ),
            ),
          ],
        )),
  );

}

您可以為此使用url_launcher包。

Future<bool> checkIfUrlIsValid({required String url}) async {
if (await canLaunchUrl(Uri.parse(url))) {
  return true;
}
return false;}


checkIfUrlIsValid(url: 'https://google.com'); // true;
checkIfUrlIsValid(url: 'google com'); // false;

使用這個簡單的 function 然后你可以識別字符串是否有效 URL

   bool isURl(String url){
return  RegExp(r'^((?:.|\n)*?)((http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)([-A-Z0-9.]+)(/[-A-Z0-9+&@#/%=~_|!:,.;]*)?(\?[A-Z0-9+&@#/%=~_|!:‌​,.;]*)?)')
    .hasMatch(url);  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM