You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP MySQL阿拉伯字母异形匹配搜索问题求助

阿拉伯语字母异形联合搜索解决方案

问题核心

阿拉伯语中部分字母存在多种形态(如أ/إ/ا、ي/ى、ه/ة),它们拥有不同Unicode编码,但语义上属于同一字母,需要实现输入任意一种形态时,匹配所有包含该字母所有形态的词汇。

解决方案1:PHP预处理搜索词+正则匹配

通过PHP将搜索词中的每个字母替换为包含其所有异形的正则字符集,再利用数据库的正则匹配功能实现搜索,同时避免SQL注入风险。

实现代码

// 定义阿拉伯语字母与对应异形的映射
$arabicLetterMap = [
    'أ' => '[أإا]',
    'إ' => '[أإا]',
    'ا' => '[أإا]',
    'ي' => '[يى]',
    'ى' => '[يى]',
    'ه' => '[هة]',
    'ة' => '[هة]',
];

// 获取搜索词并做安全处理
$search = trim($_POST['search'] ?? '');
$pattern = '';

// 逐个字符替换为正则集合
for ($i = 0; $i < mb_strlen($search); $i++) {
    $char = mb_substr($search, $i, 1);
    // 若字符在映射表中则替换,否则转义特殊字符
    $pattern .= isset($arabicLetterMap[$char]) ? $arabicLetterMap[$char] : preg_quote($char, '/');
}

// 使用PDO参数绑定执行正则搜索(MySQL支持REGEXP语法)
$stmt = $con->prepare("
    SELECT * 
    FROM `newdrs` 
    INNER JOIN `district` ON newdrs.prosec = district.DistCode
    INNER JOIN `case_kind` ON newdrs.case_kind = case_kind.id
    WHERE accused_names REGEXP ?
");
$stmt->execute([$pattern]);
$employee_details = $stmt->fetchAll(PDO::FETCH_ASSOC);

说明

  • 输入任意一种字母形态(如ا),会自动生成包含所有异形的正则表达式([أإا]),匹配所有包含أ、إ、ا的词汇。
  • 使用PDO参数绑定彻底避免SQL注入风险,比直接拼接字符串安全。

解决方案2:利用数据库排序规则(简化版)

部分数据库的阿拉伯语排序规则会将异形字母视为等价字符,可通过指定排序规则实现模糊匹配,无需复杂预处理。

实现代码

$search = trim($_POST['search'] ?? '');
// 使用支持阿拉伯语字符等价的排序规则(需根据数据库实际情况调整)
$stmt = $con->prepare("
    SELECT * 
    FROM `newdrs` 
    INNER JOIN `district` ON newdrs.prosec = district.DistCode
    INNER JOIN `case_kind` ON newdrs.case_kind = case_kind.id
    WHERE accused_names LIKE ? COLLATE utf8mb4_unicode_ci
");
$stmt->execute(["%$search%"]);
$employee_details = $stmt->fetchAll(PDO::FETCH_ASSOC);

说明

  • 需测试数据库的排序规则是否支持异形字母等价匹配,例如MySQL的utf8mb4_unicode_ci或utf8mb4_arabic_ci可能生效。
  • 此方法代码更简洁,但依赖数据库配置,兼容性不如正则匹配方案。

重要提醒

原代码直接将用户输入拼接到SQL语句中,存在严重SQL注入风险,无论采用哪种方案,都必须使用PDO参数绑定处理用户输入。

内容的提问来源于stack exchange,提问作者Amr Sameh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:42:43