PHP中替换换行符为<br>始终返回null该如何解决?
问题排查及解决方案
问题根因汇总
- 最常见原因:待处理字符串包含非UTF-8编码的乱码字节,PHP 7.0+ 处理非法编码字符串时,字符串处理函数会直接返回null
- 次要原因:
$message实际不是原生字符串类型,而是不可序列化的对象/资源类型,第一次echo时因为触发了__toString()输出正常,但传入字符串处理函数时类型校验失败返回null - 罕见原因:服务器安装了suhosin等安全扩展,禁用了相关字符串函数/添加了非法过滤规则,或者代码中存在自定义重写的
nl2br、preg_replace同名函数覆盖了系统实现
分步解决办法
- 第一步:先确认变量类型和编码合法性,在处理前先执行以下代码排查
var_dump($message, is_string($message), mb_detect_encoding($message, ['UTF-8', 'GBK', 'GB2312', 'BIG5'], true));
- 第二步:如果是编码不合法导致的问题,先转码为合法UTF-8再处理:
// 先转码为UTF-8,再执行换行替换 $message = mb_convert_encoding($message, 'UTF-8', mb_detect_encoding($message, ['UTF-8', 'GBK', 'GB2312', 'BIG5'], true)); $message = nl2br($message);
- 第三步:如果是变量类型不是原生字符串导致的问题,先手动转为字符串再处理:
// 先强转为字符串 $message = (string)$message; $message = nl2br($message);
- 第四步:排查是否有扩展/自定义函数覆盖系统实现,执行以下代码查看函数信息:
var_dump(function_exists('nl2br'), new ReflectionFunction('nl2br'));
如果输出显示函数是用户定义的,检查代码中是否有同名函数声明,删除即可;如果是扩展禁用,修改php.ini移除对应函数的禁用配置。
内容的提问来源于stack exchange,提问作者roguediv
相关产品推荐
相关产品推荐

