[英]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 dev
或flutter 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.