Dart / Flutter - 验证 URL 的字符串

Jak*_*ake 22 string url-validation dart flutter

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

我找到了 flutter 包验证器,但这与 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)
Run Code Online (Sandbox Code Playgroud)

如果您可以找到一个修复程序,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
Run Code Online (Sandbox Code Playgroud)

iPa*_*tel 25

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

bool _validURL = Uri.parse(_adVertData.webLink).isAbsolute;
Run Code Online (Sandbox Code Playgroud)

只需检查的值 _validURL

  • 对于字符串“http:”,这也返回 true。 (12认同)
  • 还有 Uri.tryParse 在 uri 字符串无效的情况下不会抛出异常。 (2认同)

Set*_*hil 13

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

  bool isURLValid = Uri.parse('https://google.com/').host.isNotEmpty;
Run Code Online (Sandbox Code Playgroud)

正如一些人已经报告的那样,使用 .isAbsolute 将诸如“http:”之类的 URL 标记为有效 URL,但实际上并非如此。


Joh*_*ang 10

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');
Run Code Online (Sandbox Code Playgroud)

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


rmt*_*zie 9

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

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

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


Rob*_*hof 8

Uri.tryParse(mystring)?.hasAbsolutePath ?? false;
Run Code Online (Sandbox Code Playgroud)

一些示例结果:

网址 结果
'/sf/ask/3708301761/' 真的
asd 错误的
asd:asd 错误的
%EMPTY_STRING% 错误的
google.nl 错误的
https: 错误的
https:// 错误的
https://a 错误的
https://a/ 真的

  • 值得注意的是,对于“/”或任何其他非 http(s) 的 Uri(如“ftp:/”),这也将是“true”。如果你也想检查这一点,它应该是:`final uri = Uri.tryParse('/'); 最终 isValid = uri != null && uri.hasAbsolutePath && uri.scheme.startsWith('http');` (8认同)

Dha*_*ata 8

使用正则表达式进行验证

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;
}  
Run Code Online (Sandbox Code Playgroud)

使用内置包进行验证

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

如果您想要一些特殊情况,例如必须验证deepLink,那么 RegEx 实践是最好的。