27

我正在尝试创建一个系统,在该系统中我可以验证一个字符串以检查它是否是一个 url。(https://www.google.com/

我找到了颤振包验证器,但这与 dart 2 不兼容,因此与我的代码不兼容。

类似地命名,我也找到了验证器包,但我似乎无法让它与我的代码一起正常工作,因为它会引发以下错误;(希望你喜欢我的项目名称;)

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
4

8 回答 8

27

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

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

只需检查的值_validURL

于 2019-10-04T15:40:19.963 回答
13
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/ 真的
于 2021-05-09T16:02:47.907 回答
11
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');
match = RegExp(urlPattern, caseSensitive: false).firstMatch('http://www.google.com');

您也可以使用正则表达式。

于 2019-04-14T11:28:43.073 回答
6

出于某种原因,该validators软件包需要 Flutter 测试库的最新版本,而不是留给应用程序使用。也许有一个很好的理由(即他们正在使用一项新功能)。

Flutter 引擎内部需要特定版本的 flutter_test 库(这就是为什么指定它的版本通常是个坏主意)。所以要解决这个问题,你必须通过运行来升级你的颤振flutter upgrade。如果您已经处于您所在频道的最新版本,您可能需要运行flutter channel devflutter channel master切换到更新频率更高的频道(实际上是分支)。

dev大部分时间都在分支/通道上运行,虽然它偶尔会出现问题,但它不会发生很多。如果可能的话,我建议不要使用主分支。

于 2018-10-29T14:49:13.477 回答
4

我使用了下面的方法。根据您的记录,所有有效的 URL 都需要有一个主机(例如 google.com)。如果 URL 没有主机,它会返回一个空字符串(不是未定义或 null)。

  bool validURL = Uri.parse("https://google.com/").host == '' ? false : true;

正如一些人已经报道的那样,使用 .isAbsolute 将诸如“http:”之类的 URL 标记为有效的 URL,而这些 URL 不是。

于 2021-07-23T18:09:40.017 回答
2

使用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 练习是最好的。

于 2021-11-12T04:39:31.867 回答
1

我正在使用这种方式来验证 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;
                      }
                    },
于 2022-01-03T11:28:46.690 回答
1

对于 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全部。

于 2020-02-27T20:35:32.303 回答