Flutter如何识别文字中的电话号码

在Flutter应用中,如何从一段文本中自动识别并提取出电话号码?比如用户输入一段包含联系方式的文字,希望能快速检测出其中的手机号或固定电话号码。是否有现成的插件或正则表达式方案可以实现这个功能?最好能支持多种国际电话号码格式的识别。

2 回复

Flutter中可通过phone_numberurl_launcher包,结合正则表达式识别文本中的电话号码。使用RegExp匹配手机号格式,然后高亮或提取号码。

更多关于Flutter如何识别文字中的电话号码的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在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}:匹配固定电话
  • 支持带区号、分机号等格式

这种方法可以快速识别文本中的电话号码,并支持点击拨号等功能。

回到顶部