在处理日志文件时,我们经常会遇到需要对敏感信息进行脱敏的情况,比如用户的 IP 地址、身份验证 token 等。这些信息如果未经处理就直接存储或输出,可能会引起隐私和安全问题。
PHP 提供了多种字符串处理函数,而其中 mb_eregi_replace 是一个多字节安全的函数,它支持正则表达式替换,同时支持 Unicode 字符集,特别适用于包含中文等多字节字符的内容处理。
本文将介绍如何使用 mb_eregi_replace 来查找和替换日志内容中的 IP 地址和 token 字符串。
假设我们有以下日志片段:
[2025-05-27 10:00:00] User login from 192.168.1.100 with token abc123xyz
[2025-05-27 10:05:00] Failed login from 10.0.0.5 with token 9f8d7e6c5b
我们希望将其中的 IP 地址和 token 替换为 [REDACTED_IP] 和 [REDACTED_TOKEN]。
PHP 的 mb_eregi_replace 函数使用方式如下:
string mb_eregi_replace ( string $pattern , string $replace , string $string [, string $option = "msr" ] )
下面是一个完整的示例脚本,用来处理日志内容:
<?php
// 模拟读取日志内容
$log = <<<LOG
[2025-05-27 10:00:00] User login from 192.168.1.100 with token abc123xyz
[2025-05-27 10:05:00] Failed login from 10.0.0.5 with token 9f8d7e6c5b
LOG;
// 正则匹配 IPv4 地址
$pattern_ip = '\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b';
// 正则匹配 token(假设为由字母和数字组成的长度 8 到 32)
$pattern_token = '\b[a-zA-Z0-9]{8,32}\b';
// 替换 IP 地址
$log = mb_eregi_replace($pattern_ip, '[REDACTED_IP]', $log);
// 替换 token,注意避免误伤时间戳中的数字
$log = mb_eregi_replace('with token ' . $pattern_token, 'with token [REDACTED_TOKEN]', $log);
// 输出结果
echo nl2br(htmlspecialchars($log));
?>
输出将如下所示:
[2025-05-27 10:00:00] User login from [REDACTED_IP] with token [REDACTED_TOKEN]
[2025-05-27 10:05:00] Failed login from [REDACTED_IP] with token [REDACTED_TOKEN]
在实际项目中,我们通常不会直接对原始日志文件进行操作,而是通过日志读取和转储流程中对内容做处理。比如你可以将上述逻辑封装为一个函数,然后用于日志展示页面:
function sanitize_log($logContent) {
$pattern_ip = '\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b';
$pattern_token = '\b[a-zA-Z0-9]{8,32}\b';
$logContent = mb_eregi_replace($pattern_ip, '[REDACTED_IP]', $logContent);
$logContent = mb_eregi_replace('with token ' . $pattern_token, 'with token [REDACTED_TOKEN]', $logContent);
return $logContent;
}
// 举例调用
$rawLog = file_get_contents("https://m66.net/logs/example.log");
echo nl2br(htmlspecialchars(sanitize_log($rawLog)));
mb_eregi_replace 提供了一种简洁而高效的方式来处理含有敏感信息的日志内容。通过合理的正则表达式匹配,可以灵活替换 IP、token 等关键数据,保护用户隐私,并确保日志对开发和运维依然有用。
使用时要注意:
保证替换模式不会误伤其他合法数据。
注意 mb_eregi_replace 是大小写不敏感的,如需区分大小写可使用 mb_ereg_replace。
PHP 8.0 之后该函数可能不再推荐使用,建议使用 PCRE 系列函数配合 preg_replace,但在简单脚本中它依然方便实用。