Dart / Flutter - 验证 URL 的字符串

Dart / Flutter - Validating a string for URL

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

我找到了 flutter 包 validator 但这与 dart 2 不兼容,因此与我的代码不兼容。

名称相似,我也找到了 validators 包,但我似乎无法使用我的代码使其正常工作,因为它会抛出以下错误; (希望你喜欢我的项目名称;)

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

出于某种原因,validators 包需要最新版本的 flutter 测试库,而不是将其留给应用程序。也许这是有充分理由的(即他们正在使用一项新功能)。

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

我在 dev branch/channel 上 运行 大多数情况下,虽然它偶尔会出现问题,但发生的次数并不多。不过,我建议尽可能不要使用 master 分支。

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');

您可以使用正则表达式。

要检查有效的 URL 字符串,您只需像下面那样使用 Uri.parse()

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

只需检查 _validURL

的值

对于正则表达式,如果您要在字符串中查找 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 全部。

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

一些示例结果:

url result
' true
asd false
asd:asd false
%EMPTY_STRING% false
google.nl false
https: false
https:// false
https://a false
https://a/ true

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

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

使用 .isAbsolute,正如一些人已经报道的那样,将 URL 标记为有效的 URL,例如 'http:'。

使用 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 实践是最好的。

我正在使用这种方式来验证网址。在您的 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;
                      }
                    },