如何编写PHP if语句判断字符串首字符是否为智能引号
问题根源
- 你判断的
"是普通直双引号的HTML实体,和智能引号完全是两个不同字符,判断逻辑自然不生效。智能左双引号的Unicode编码为U+201C,是多字节UTF-8字符。 - 直接用
$bookTitle[0]取首字符是单字节读取逻辑,UTF-8下智能引号占3个字节,直接取下标0只会拿到第一个字节的乱码,不可能匹配成功。
解决方法
- 先确认全链路编码统一为UTF-8:数据库表编码用utf8mb4、PHP源文件本身保存为UTF-8无BOM格式、页面输出头声明
Content-Type: text/html; charset=utf-8,先解决输出乱码问题。 - 用多字节安全的
mb_substr函数取首字符,避免单字节读取导致的乱码。 - 匹配目标改为智能引号的实际值,为了避免源文件编码导致的字符识别问题,推荐直接用Unicode转义写法。
修正后的代码如下:
<?php // 确保mbstring扩展已启用,绝大多数PHP环境默认开启该扩展 $firstChar = mb_substr($bookTitle, 0, 1, 'UTF-8'); // 同时匹配左、右智能双引号,如有单智能引号匹配需求可自行追加判断条件 if ($firstChar === "\u{201C}" || $firstChar === "\u{201D}") { echo $Parsedown->text($bookTitle . ' ' . $bookSubtitle); } else { echo '<em>' . $Parsedown->text($bookTitle . ' ' . $bookSubtitle) . '</em>'; } ?>
如果你的数据库中存储的是转义后的智能引号HTML实体,只需要把判断条件换成“和”即可。
内容的提问来源于stack exchange,提问作者gigaboy
相关产品推荐
相关产品推荐

