从 html 内容的可见文本中颤动搜索文本

Posted

技术标签:

【中文标题】从 html 内容的可见文本中颤动搜索文本【英文标题】:Flutter search text out of html content's visible text 【发布时间】:2022-01-14 03:24:13 【问题描述】:

在我的应用程序中,有一个搜索功能可以按用户输入的搜索文本过滤消息列表。但我的消息项的正文字段包含完整格式的 html 文档 (<html>...</html>)。我想通过将搜索过滤应用于邮件正文字段来过滤邮件列表。

 _getFilteredMessageList() 
    if (!StringHelper.isNullOrWhiteSpace(this._searchText)) 
      return _messagesList.where((msg) => msg.title.toLowerCase().contains(this._searchText.toLowerCase()) || msg.body.toLowerCase().contains(this._searchText.toLowerCase())).toList();
    
    return _messagesList;
  

这里的msg.body 是 HTML 内容字段。

我只想按用户可见的文本内容进行搜索,忽略所有不可见的标签和 cmets。

在 Flutter 中是否有任何包或逻辑可以实现此功能?

Flutter v2.2.2

【问题讨论】:

请分享您的代码以获得更好的答案。 @Diwyansh 通过添加过滤代码更新。 我建议您解析 html 内容,这样可以很容易地过滤掉列表。您可以使用 html 包进行解析。使用简单。 @SandunPerera 试试这个包来解析 html 到 String pub.dev/packages/flutter_html 您能否提供一个示例代码,因为我需要 HTML 到纯文本解析器,方法是忽略所有非可视 html 内容并仅提取文本。 【参考方案1】:

从网上找到一个解决方案,示例代码如下。

import 'package:html/parser.dart';

static String getHTMLBodyPlainTextFromHTMLDocument(String htmlString) 
  var document = parse(htmlString);
  String parsedString = parse(document.body!.text).documentElement!.text;
  // parsedString = StringHelper.removeLineBreaks(parsedString);
  // parsedString = StringHelper.repalceMultipleSpacesWithSingleSpace(parsedString);
  return parsedString.trim();

上述方法将为您提供在 WebView 小部件中对用户可见的纯文本,并且它将 完全去除 html 标记和非可视元素。但是在纯文本中会有很多不必要的空格,我们必须单独删除它们以适当的间距对文本进行碎片整理,以节省可变的内存大小。

上面注释的两行代码将换行符和多余空格作为单独的辅助方法手动编写。

【讨论】:

以上是关于从 html 内容的可见文本中颤动搜索文本的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤动中绘制带有图像和文本的卡片列表

bat中如何筛选文本文件中某行某段文字,提取并给变量赋值

颤动中的行文本填充问题

关于C语言中文本文件的逐行读取的实现

文本结尾在TextView中消失

怎么把电脑所有文本解码设置为UTF8。我是问永久的?