Flutter如何识别文字中的电话号码
在Flutter应用中,如何从一段文本中自动识别并提取出电话号码?比如用户输入一段包含联系方式的文字,希望能快速检测出其中的手机号或固定电话号码。是否有现成的插件或正则表达式方案可以实现这个功能?最好能支持多种国际电话号码格式的识别。
2 回复
在Flutter中识别文字中的电话号码,可以通过以下方法实现:
1. 使用正则表达式匹配
import 'package:flutter/material.dart';
class PhoneNumberRecognizer {
static final RegExp phoneRegex = RegExp(
r'(\+?86)?1[3-9]\d{9}|(\+?0?86\-?)?\(?0\d{2,3}\)?\-?\d{7,8}',
caseSensitive: false,
multiLine: true,
);
static List<String> extractPhoneNumbers(String text) {
Iterable<RegExpMatch> matches = phoneRegex.allMatches(text);
return matches.map((match) => match.group(0)!).toList();
}
}
// 使用示例
void main() {
String text = '我的电话是13812345678,公司电话是010-12345678';
List<String> phoneNumbers = PhoneNumberRecognizer.extractPhoneNumbers(text);
print(phoneNumbers); // [13812345678, 010-12345678]
}
2. 使用第三方库
安装 phone_numbers 包
在 pubspec.yaml 中添加:
dependencies:
phone_numbers: ^0.1.2
使用示例
import 'package:phone_numbers/phone_numbers.dart';
Future<void> extractPhoneNumbers(String text) async {
final parser = PhoneNumberParser();
final matches = await parser.parseString(text);
for (var match in matches) {
print('Phone: ${match.phoneNumber}');
print('Type: ${match.type}');
print('Valid: ${match.isValid}');
}
}
3. 在文本中高亮显示电话号码
import 'package:flutter/material.dart';
class PhoneNumberText extends StatelessWidget {
final String text;
PhoneNumberText(this.text);
@override
Widget build(BuildContext context) {
final matches = PhoneNumberRecognizer.extractPhoneNumbers(text);
return RichText(
text: _buildTextSpan(text, matches),
);
}
TextSpan _buildTextSpan(String text, List<String> phoneNumbers) {
List<TextSpan> spans = [];
int currentIndex = 0;
for (String phone in phoneNumbers) {
int startIndex = text.indexOf(phone, currentIndex);
if (startIndex == -1) continue;
// 添加普通文本
if (startIndex > currentIndex) {
spans.add(TextSpan(
text: text.substring(currentIndex, startIndex),
));
}
// 添加电话号码(带样式)
spans.add(TextSpan(
text: phone,
style: TextStyle(
color: Colors.blue,
decoration: TextDecoration.underline,
),
recognizer: TapGestureRecognizer()
..onTap = () => _onPhoneNumberTap(phone),
));
currentIndex = startIndex + phone.length;
}
// 添加剩余文本
if (currentIndex < text.length) {
spans.add(TextSpan(
text: text.substring(currentIndex),
));
}
return TextSpan(children: spans, style: TextStyle(fontSize: 16));
}
void _onPhoneNumberTap(String phone) {
// 处理电话号码点击事件
print('拨打电话: $phone');
}
}
正则表达式说明
(\+?86)?1[3-9]\d{9}:匹配中国手机号(\+?0?86\-?)?\(?0\d{2,3}\)?\-?\d{7,8}:匹配固定电话- 支持带区号、分机号等格式
这种方法可以快速识别文本中的电话号码,并支持点击拨号等功能。


