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 dev
或 flutter 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;
}
},
我正在尝试创建一个系统,我可以在其中验证字符串以检查它是否为 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 dev
或 flutter 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 |
---|---|
' | |
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;
}
},