Flutter文本解析插件efficient_parse_text的使用

Flutter文本解析插件efficient_parse_text的使用

细节文档

使用其实就是实现之前定义的抽象类接口。

1. 不匹配默认样式

这个很好理解,就是不匹配的文本展示样式,这个是必须实现的。

class HighlightUnMatch extends XHHighlightMatch {
  [@override](/user/override)
  InlineSpan matchBuilder(XHMatchInfo matchInfo) {
    // 返回一个文本样式,默认为黑色字体
    return TextSpan(
        text: matchInfo.value,
        style: const TextStyle(fontSize: 16, color: Colors.black));
  }

  [@override](/user/override)
  Pattern? matchReg() {
    // 不匹配任何模式
    return null;
  }

  [@override](/user/override)
  int get matchType => -1;
}

2. 匹配链接

class URLMatch extends XHHighlightMatch {
  [@override](/user/override)
  InlineSpan matchBuilder(XHMatchInfo matchInfo) {
    // 返回一个点击手势,可以打开链接
    return WidgetSpan(
      alignment: PlaceholderAlignment.middle,
      child: GestureDetector(
          onTap: () {
            print('to open url: ${matchInfo.value}');
          },
          child: Text(
            matchInfo.value,
            style: const TextStyle(
                color: Colors.blue, fontSize: 16, fontWeight: FontWeight.bold),
          )),
    );
  }

  [@override](/user/override)
  Pattern? matchReg() {
    // 正则表达式用于匹配URL
    return RegExp(
        r"(http(s)?)://[a-zA-Z\d@:._+~#=-]{1,256}.[a-z\d]{2,18}\b([-a-zA-Z\d!@:_+.~#?&/%,$]*)(?<![$])");
  }

  [@override](/user/override)
  int get matchType => 2;
}

3. 匹配邮箱地址

class EmailMatch extends XHHighlightMatch {
  [@override](/user/override)
  InlineSpan matchBuilder(XHMatchInfo matchInfo) {
    // 返回一个带有粉色字体样式的文本
    return (TextSpan(
        text: matchInfo.value,
        style: const TextStyle(color: Colors.pink, fontSize: 16)));
  }

  [@override](/user/override)
  Pattern? matchReg() {
    // 正则表达式用于匹配邮箱地址
    return RegExp(r"\b[\w.-]+@[\w.-]+.\w{2,4}\b");
  }

  [@override](/user/override)
  int get matchType => 3;
}

4. 匹配表情

class EmoMatch extends XHHighlightMatch {
  // 这里可以添加更多表情的正则匹配逻辑
}

5. 初始化解析器

前面实现了3种匹配对象和1种不匹配对象, 如果你需要再匹配其他的类型,按照相同的方法添加就行了。是不是很简单!

final matchManager = XHHighlightMatchCore(matchList: [
  EmailMatch(),
  EmoMatch(),
  URLMatch(),
], unMatch: HighlightUnMatch());

6. 创建组件

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);
  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          RichText(
              text: TextSpan(
                  children: matchManager.matchThenGenInlineSpan(
                      "你好[爱心][呲牙] 看链接 https://mp.weixin.qq.com 邮箱地址: leaf@test.com;"))),
          const Divider(),
          RichText(
              text: TextSpan(
                  children: matchManager.matchThenGenInlineSpan(
                      "你好[你好]https://www.baidu.com;llll"))),
          const Divider(),
          RichText(
              text: TextSpan(
                  children: matchManager.matchThenGenInlineSpan("[你好]z[笑脸]l"))),
          const Divider(),
          RichText(
              text: TextSpan(
                  children: matchManager.matchThenGenInlineSpan(
                      "Flutter调优工具使用及Flutter高性能编程部分要点分析:https://juejin.cn/post/7157905466821967902"))),
          const Divider(),
          RichText(
              text:
                  TextSpan(children: matchManager.matchThenGenInlineSpan("L"))),
          const Divider(),
          RichText(
              text: TextSpan(
                  children: matchManager.matchThenGenInlineSpan("leaf"))),
          const Divider(),
        ],
      ),
    );
  }
}

更多关于Flutter文本解析插件efficient_parse_text的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter文本解析插件efficient_parse_text的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


efficient_parse_text 是一个用于 Flutter 的文本解析插件,它可以帮助开发者高效地解析和格式化文本数据。这个插件通常用于处理复杂的文本解析任务,例如解析富文本、提取特定格式的数据等。

安装

首先,你需要在 pubspec.yaml 文件中添加 efficient_parse_text 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  efficient_parse_text: ^1.0.0  # 请确保使用最新版本

然后运行 flutter pub get 来安装依赖。

基本使用

1. 导入插件

import 'package:efficient_parse_text/efficient_parse_text.dart';

2. 创建解析器

你可以使用 TextParser 类来创建解析器实例:

final parser = TextParser();

3. 解析文本

TextParser 提供了多种方法来解析文本。以下是一些常见的用法:

3.1 解析普通文本
String text = "Hello, World!";
ParsedText parsedText = parser.parse(text);
print(parsedText.text); // 输出: Hello, World!
3.2 解析带有格式的文本

假设你有一个包含 HTML 标签的文本:

String htmlText = "<b>Hello</b>, <i>World</i>!";
ParsedText parsedText = parser.parse(htmlText);
print(parsedText.text); // 输出: Hello, World!
3.3 提取特定格式的数据

你可以使用正则表达式来提取特定格式的数据:

String text = "Email: john.doe@example.com, Phone: 123-456-7890";
ParsedText parsedText = parser.parseWithRegex(text, r"[\w\.-]+@[\w\.-]+");
print(parsedText.matches); // 输出: [john.doe@example.com]
3.4 解析富文本

efficient_parse_text 还支持解析富文本,例如 Markdown 或 HTML:

String markdownText = "**Hello**, _World_!";
ParsedText parsedText = parser.parseMarkdown(markdownText);
print(parsedText.text); // 输出: Hello, World!

高级用法

efficient_parse_text 提供了许多高级功能,例如自定义解析规则、处理复杂的数据结构等。你可以参考插件的官方文档来了解更多详细信息。

示例

以下是一个完整的示例,展示了如何使用 efficient_parse_text 来解析和提取文本中的数据:

import 'package:flutter/material.dart';
import 'package:efficient_parse_text/efficient_parse_text.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Efficient Parse Text Example'),
        ),
        body: Center(
          child: TextParserExample(),
        ),
      ),
    );
  }
}

class TextParserExample extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    final parser = TextParser();
    String text = "Email: john.doe@example.com, Phone: 123-456-7890";
    ParsedText parsedText = parser.parseWithRegex(text, r"[\w\.-]+@[\w\.-]+");

    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Text("Original Text: $text"),
        SizedBox(height: 20),
        Text("Extracted Emails: ${parsedText.matches}"),
      ],
    );
  }
}
回到顶部