PHP如何检测字符串中特定非字母数字UTF-8/Unicode字符
错误原因说明
strpos参数顺序填写错误:第一个参数应为待搜索的原字符串,第二个参数是要查找的子串,你的写法正好顺序颠倒。- 多字节Unicode字符匹配建议使用多字节字符串处理函数,避免单字节函数解析多字节字符时出现偏移错误。
- 匹配判断逻辑错误:如果符号出现在字符串开头,位置类函数会返回整数
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
相关产品推荐
相关产品推荐

