本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

一、智能分词能力

智能分词是 ArkWeb 组件提供的一种 H5 页面内文本实体识别功能,能够自动识别页面中的特殊信息(如电话号码、网址、邮箱等),并通过高亮显示和快捷操作菜单,让用户可以直接与这些实体进行交互。

核心功能

功能 描述 适用版本
文本分词高亮 自动识别并高亮标注页面内的特殊实体 API 20+
分词长按预览 长按实体弹出预览菜单,提供快捷操作 API 20+
文本选择菜单扩展 选中文本时显示 AI 菜单选项 API 22+

可识别的实体类型

类型 示例 对应操作
电话 400-123-4567 拨打电话
网址 https://www.example.com 打开链接
邮箱 test@example.com 发送邮件
地址 北京市海淀区中关村 地图查看
时间 2025.06.01 添加日历

二、启用智能分词功能

启用智能分词功能需要设置两个关键属性:

import { webview } from '@kit.ArkWeb';

@Entry
@Component
struct Index {
  webController: webview.WebviewController = new webview.WebviewController();
  
  build() {
    Column() {
      Web({
        src: $rawfile('index.html'),
        controller: this.webController
      })
      .enableDataDetector(true)           // 开启智能分词功能
      .dataDetectorConfig({                // 配置识别参数
        types: [],                         // 实体识别类型,为空则识别所有类型
        enablePreviewMenu: false            // 是否启用长按预览
      })
    }
    .height('100%')
    .width('100%')
  }
}

参数说明

参数 类型 必填 说明
enableDataDetector boolean 是否开启智能分词功能,默认为 false
dataDetectorConfig.types Array 指定识别的实体类型,为空时识别所有类型
dataDetectorConfig.enablePreviewMenu boolean 是否启用分词长按预览功能

三、文本分词高亮

当 Web 组件加载的 H5 页面完成后,系统会自动扫描页面文本内容,识别出符合规则的特殊实体,并进行高亮标注。高亮后的实体将转变为超链接形式,用户点击后会弹出相应的操作菜单。

高亮过滤规则

并非所有文本都会被识别和高亮,以下情况会被过滤:

规则 说明 示例
输入框/可编辑区域 不处理输入框内的文本 <input value="400-123-4567">
超链接标签内 不处理 <a> 标签内的文本 <a>400-123-4567</a>
跨域 iframe 不处理跨域 iframe 内的内容 <iframe src="其他域名">
嵌套 iframe 两层及以上嵌套的 iframe iframe 嵌套超过两层
跨节点实体 被多个标签分割的实体 <p>星<span>期六</span></p>

3.3 示例

HTML 文件(index.html)

<!DOCTYPE html>
<html>
<head>
    <title>智能分词测试</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
    <h2>可识别的实体示例:</h2>
    <p>电话:400-123-4567</p>
    <p>邮箱:test@example.com</p>
    <p>网址:https://www.example.com/</p>
    <p>日期:2025.06.01</p>
    <p>地址:北京市海淀区中关村</p>
    
    <h2>不会高亮的示例:</h2>
    <p>不会高亮的星<span>期六</span>(跨节点)</p>
    <input value="400-123-4567" placeholder="输入框内的不会高亮">
    <a href="https://www.example.com">超链接内的不会高亮</a>
</body>
</html>

ETS 文件

import { webview } from '@kit.ArkWeb';

@Entry
@Component
struct DataDetectorDemo {
  webController: webview.WebviewController = new webview.WebviewController();
  
  build() {
    Column() {
      Row() {
        Button('刷新页面')
          .onClick(() => {
            this.webController.refresh();
          })
      }
      .width('100%')
      .padding(10)
      
      Web({
        src: $rawfile('index.html'),
        controller: this.webController
      })
      .enableDataDetector(true)
      .dataDetectorConfig({
        types: [],  // 识别所有类型
        enablePreviewMenu: false
      })
    }
    .height('100%')
    .width('100%')
  }
}

3.4 交互行为

操作 行为 说明
点击实体 弹出操作菜单 根据实体类型显示不同菜单项
右键点击 超链接默认行为 触发浏览器默认右键菜单
鼠标拖拽 超链接默认行为 可拖拽链接
长按实体 取决配置 根据 enablePreviewMenu 设置

3.5 特殊场景处理

当页面文本元素设置了 user-select:none 样式时:

.no-select {
  user-select: none;  /* 不可选中 */
}
  • 选择文本:菜单中的"选择文本"选项将无效

  • 复制文本:如果 copyOptions 不为 CopyOptions.None,仍可复制实体文本

Web({ src: $rawfile('index.html'), controller: this.controller })
  .enableDataDetector(true)
  .copyOptions(CopyOptions.LocalDevice)  // 允许复制
  .dataDetectorConfig({
    types: [],
    enablePreviewMenu: false
  })

四、分词长按预览

分词长按预览是智能分词的高级功能,用户在长按已高亮的实体文本时,会弹出预览菜单,提供更丰富的操作选项。

配置方法

Web({
  src: $rawfile('index.html'),
  controller: this.webController
})
.enableDataDetector(true)
.dataDetectorConfig({
  enablePreviewMenu: true,  // 开启长按预览
  types: []                  // 识别所有类型
})

4.3 预览效果

开启长按预览后,当用户长按被高亮的实体文本时,会弹出预览菜单:

  • 电话号码:显示号码,提供"呼叫"选项

  • 网址:显示链接,提供"打开"选项

  • 邮箱:显示地址,提供"发送邮件"选项

  • 地址:显示位置,提供"查看地图"选项

  • 日期:显示日期,提供"添加日历"选项

注意:通过 bindSelectionMenu 绑定的自定义菜单与分词长按预览菜单互不影响。

// 自定义菜单(针对普通元素)
.bindSelectionMenu(WebElementType.IMAGE, this.ImageMenuBuilder, WebResponseType.LONG_PRESS)

// 分词长按预览(针对高亮实体)
.dataDetectorConfig({
  enablePreviewMenu: true
})

// 两者互不影响:
// - 长按被高亮的分词超链接 → 弹出分词预览菜单
// - 长按普通超链接 → 弹出自定义菜单(如果配置了)

五、文本选择菜单扩展(API 22+)

从 API version 22 开始,ArkWeb 支持通过 enableSelectedDataDetector 单独配置文本选择 AI 菜单的启用情况。当用户在非编辑区域选中文本时,如果满足特定条件,文本选择菜单会展示对应的 AI 菜单选项。

启用配置

Web({
  src: $rawfile('index.html'),
  controller: this.webController
})
.enableDataDetector(true)
.enableSelectedDataDetector(true)  // API 22+,单独启用文本选择AI菜单
.dataDetectorConfig({
  types: [TextDataDetectorType.PHONE, TextDataDetectorType.URL, TextDataDetectorType.EMAIL],
  enablePreviewMenu: true
})

显示条件

文本选择 AI 菜单仅在同时满足以下条件时显示:

条件 说明 示例
区域限制 非编辑区域 不在 input、textarea 内
长度限制 UTF-8 编码后 ≤ 255 字节 中文约 85 字以内
实体数量 仅包含一个匹配的实体词 选中文本只能包含一个实体
操作状态 不是"全选"操作 用户手动选择的文本

工作流程

用户选中文本
    ↓
检查是否满足条件
  ├─ 编辑区域? → 是 → 不显示AI菜单
  ├─ 长度>255字节? → 是 → 不显示AI菜单  
  ├─ 包含多个实体? → 是 → 不显示AI菜单
  ├─ 全选操作? → 是 → 不显示AI菜单
  ↓
显示AI菜单选项
    ↓
用户点击AI菜单项
    ↓
执行对应操作(拨号/打开链接/发送邮件等)

备注:AI 菜单项的出现与是否选中高亮的实体文本无关。即使选中的文本原本没有被高亮(例如在不可高亮的区域),只要满足上述条件,AI 菜单项就会显示。

功能对比

功能 API版本 配置项 触发方式 特点
文本分词高亮 20+ enableDataDetector 页面加载后自动 自动识别并高亮
分词长按预览 20+ enablePreviewMenu 长按高亮实体 提供预览和快捷操作
文本选择AI菜单 22+ enableSelectedDataDetector 选中文本 与高亮无关,需满足条件
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐