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

PHP如何检测字符串中特定非字母数字UTF-8/Unicode字符

错误原因说明

  1. strpos 参数顺序填写错误:第一个参数应为待搜索的原字符串,第二个参数是要查找的子串,你的写法正好顺序颠倒。
  2. 多字节Unicode字符匹配建议使用多字节字符串处理函数,避免单字节函数解析多字节字符时出现偏移错误。
  3. 匹配判断逻辑错误:如果符号出现在字符串开头,位置类函数会返回整数0,用== true判断时0会被强转为布尔false,永远无法触发匹配。

解决方案

方案1:用mb_strpos分别匹配单个符号

适合需要分别处理每个符号、逻辑差异较大的场景,需确保PHP环境开启mbstring扩展:

$summary = $event->getSummary();
$encoding = 'UTF-8';

// 匹配 ❌ U+274C
if (mb_strpos($summary, "\u{274C}", 0, $encoding) !== false) {
    echo "<h1>FOUND! \u{274C} :</h1>";
    // 对应❌的业务逻辑
}
// 匹配 ✅ U+2705
elseif (mb_strpos($summary, "\u{2705}", 0, $encoding) !== false) {
    echo "<h1>FOUND! \u{2705} :</h1>";
    // 对应✅的业务逻辑
}
// 匹配 ⚠ U+26A0
elseif (mb_strpos($summary, "\u{26A0}", 0, $encoding) !== false) {
    echo "<h1>FOUND! \u{26A0} :</h1>";
    // 对应⚠的业务逻辑
}

如果仅需要判断字符串开头是否为目标符号,保持第三个偏移量参数为0即可。


方案2:正则表达式匹配

适合需要一次匹配直接识别出对应符号的场景,加u修饰符开启Unicode匹配即可:

$summary = $event->getSummary();
// ^表示仅匹配字符串开头
if (preg_match('/^[\x{2705}\x{274C}\x{26A0}]/u', $summary, $matches)) {
    $matchedChar = $matches[0];
    switch ($matchedChar) {
        case "\u{2705}":
            // ✅的业务逻辑
            break;
        case "\u{274C}":
            // ❌的业务逻辑
            break;
        case "\u{26A0}":
            // ⚠的业务逻辑
            break;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:45:00