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

PHP 7.1/7.2版本下Smarty Gravatar函数代码无法运行求助

修复Smarty Gravatar函数的PHP兼容性与编码问题

我来帮你搞定这个在PHP7.1/7.2跑不动、最新PHP有编码bug的Gravatar函数。先拆解问题根源,再给出修复后的代码:

问题分析

  1. PHP7.1/7.2兼容性问题:原始代码里的&$smarty引用传递,在PHP7.1+的严格模式下会触发警告甚至错误——现代Smarty版本已经不需要强制引用这个参数了。另外,参数校验不够严谨,比如rating参数如果传入非法值,会生成无效的Gravatar URL。
  2. 最新PHP编码问题:用strtolower()处理邮箱时,遇到带非ASCII字符的国际化邮箱(比如Anna Müller@example.de)会处理出错,导致生成的Gravatar哈希值不正确,进而加载不到正确头像。

修复方案与代码

下面是修复后的完整代码,针对两个问题都做了处理:

<?php
function smarty_function_gravatar($params, $smarty) {
    // 处理邮箱:多字节安全转小写,确保UTF-8编码,去除前后空格
    $email = isset($params['email']) 
        ? trim(mb_strtolower($params['email'], 'UTF-8')) 
        : '';
    
    // 校验评级参数,只允许Gravatar支持的合法值
    $valid_ratings = ['G', 'PG', 'R', 'X'];
    $rating = isset($params['rating']) && in_array($params['rating'], $valid_ratings)
        ? $params['rating']
        : 'R';
    
    // 构建基础Gravatar URL
    $url = "https://www.gravatar.com/avatar/" . md5($email) . "?r=" . urlencode($rating);
    
    // 处理默认头像参数,确保编码正确
    if (isset($params['default'])) {
        $url .= "&d=" . urlencode($params['default']);
    }
    
    // 处理尺寸参数,确保是正整数,避免非法值
    if (isset($params['size']) && is_numeric($params['size']) && (int)$params['size'] > 0) {
        $url .= "&s=" . (int)$params['size'];
    }
    
    // 返回生成的URL(如果你的原始代码是直接输出,改成echo $url即可)
    return $url;
}
?>

关键修改说明

  • 移除&$smarty的引用符号:解决PHP7.1+中引用传递的严格模式警告,现代Smarty版本不需要强制引用这个参数。
  • 用mb_strtolower()替代strtolower():支持多字节字符的邮箱地址,确保生成的Gravatar哈希值准确,解决最新PHP的编码问题。
  • 增加参数合法性校验:对rating和size参数做校验,避免生成无效的Gravatar URL,提升代码健壮性。
  • 明确UTF-8编码:处理邮箱时指定编码,避免不同环境下的编码差异导致的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:34:28