PHP中如何比较HTML编码文本与对应纯文本是否相等
问题根源
你之前的代码对比不生效,核心原因是‘解码后是Unicode左单引号‘、’解码后是Unicode右单引号’,和$s2里的半角直单引号'本身是不同的字符,直接对比自然不会相等。
解决方案
你需要先将两个字符串的HTML实体统一解码,再对标点做标准化处理后再对比,两种常用实现方式如下:
方案1:用intl扩展做通用标点标准化
适合需要处理大量特殊Unicode字符的场景,依赖PHP的intl扩展(大部分环境默认已安装):
// 统一解码两个字符串的HTML实体,指定编码和解析规则避免异常 $decodedS1 = html_entity_decode($s1, ENT_QUOTES | ENT_HTML5, 'UTF-8'); $decodedS2 = html_entity_decode($s2, ENT_QUOTES | ENT_HTML5, 'UTF-8'); // 创建转写器,将所有Unicode标点转换为ASCII等价形式 $transliterator = Transliterator::create('Any-Latin; Latin-ASCII;'); $normalizedS1 = $transliterator->transliterate($decodedS1); $normalizedS2 = $transliterator->transliterate($decodedS2); // 直接对比即可 if ($normalizedS1 === $normalizedS2) { echo "s1 等于 s2"; } else { echo "s1 不等于 s2"; }
方案2:手动替换常见特殊引号
不需要额外扩展,适合仅需要处理引号类差异的场景:
// 自定义方法标准化引号 function normalizeQuotes(string $str): string { $search = ['‘', '’', '“', '”']; $replace = ["'", "'", '"', '"']; return str_replace($search, $replace, $str); } // 先解码HTML实体 $decodedS1 = html_entity_decode($s1, ENT_QUOTES | ENT_HTML5, 'UTF-8'); $decodedS2 = html_entity_decode($s2, ENT_QUOTES | ENT_HTML5, 'UTF-8'); // 标准化引号后对比 $normalizedS1 = normalizeQuotes($decodedS1); $normalizedS2 = normalizeQuotes($decodedS2); var_dump($normalizedS1 === $normalizedS2); // 输出 bool(true)
注意事项
- 调用
html_entity_decode时建议显式指定编码为UTF-8、传入ENT_QUOTES | ENT_HTML5参数,避免不同环境下默认配置不同导致解码错误。 - 如果需要同时忽略大小写、重音符号的差异,可以在标准化后再调用
collator_compare做区域敏感的对比。
内容的提问来源于stack exchange,提问作者saurabh yadav
相关产品推荐
相关产品推荐

