
本文介绍使用 php 从结构化字符串数组中批量提取 cloudflare 加密邮箱链接和对应密码的完整方法,适用于自动化登录凭证解析场景。
在实际开发中(如爬取或解析第三方导出的用户数据),我们常遇到类似如下格式的混合字符串数组:其中包含 Name=、Password= 键值对,以及嵌套 Cloudflare 邮箱保护机制的 标签(含 data-cfemail 属性)。目标并非解密邮箱(该过程需额外 JS 或专用解密逻辑),而是准确识别并提取原始 HTML 邮箱标签与紧邻的 Password 值,并建立语义化映射关系。
关键挑战在于:
- 邮箱不以 Email= 开头,而是以
- Password 出现在邮箱之后,但中间可能夹杂 Address=、City= 等无关项;
- 多组用户数据连续排列,需按逻辑分组(每组含 Name → Email → Password → …)。
✅ 正确思路是:按用户块切分 + 模式匹配 + 顺序关联。以下为健壮、可复用的实现方案:
[email protected]',
'Password=xyz@123',
'Address=xyz University Lucknow',
'City=xyz',
'Name=peter',
'[email protected]',
'Password=peter@123',
'Address=address',
'City=bla',
'Name=Jack',
'[email protected]',
'Password=jack123',
'Address=jackAddress',
'City=jackCity'
];
$credentials = [];
$current = [];
foreach ($stringArray as $line) {
// 匹配邮箱标签(含 Cloudflare 保护)
if (preg_match('/]*>(.*?)<\/a>/i', $line, $emailMatch)) {
$current['Email'] = trim($line); // 保留原始 HTML 标签(含 data-cfemail,便于后续解密)
continue;
}
// 匹配 Password=xxx
if (str_starts_with($line, 'Password=')) {
$current['Password'] = substr($line, 9); // 去掉 'Password=' 前缀
if (!empty($current['Email']) && !empty($current['Password'])) {
$credentials[] = $current;
$current = []; // 重置,准备下一条记录
}
continue;
}
// 忽略 Name/Address/City 等非目标字段(仅作分组锚点,无需显式处理)
}
// 输出结构化结果(符合需求格式)
echo "";
print_r($credentials);
echo "
";
?>? 输出示例(精简后):
立即学习“PHP免费学习笔记(深入)”;
Array
(
[0] => Array
(
[Email] => [email protected]
[Password] => xyz@123
)
[1] => Array
(
[Email] => [email protected]
[Password] => peter@123
)
[2] => Array
(
[Email] => [email protected]
[Password] => jack123
)
)⚠️ 重要注意事项:
-
Cloudflare 邮箱加密不可直接正则解密:data-cfemail 是十六进制编码,需客户端 JS 执行解密(或服务端模拟解密逻辑),本方案保留原始 HTML 是为后续兼容性;若需明文邮箱,请集成 cf-email-decrypt 等工具。
-
健壮性增强建议:生产环境应添加 trim()、空行过滤、isset() 检查及异常捕获;若数据源不稳定,可先用 array_filter($stringArray, 'strlen') 清理空白行。
-
安全警示:此操作涉及用户凭证,请确保运行环境隔离、日志脱敏、且不将 $credentials 直接暴露于前端或错误响应中——尤其避免在 print_r() 调试后遗漏删除。
通过该方案,你可稳定、可扩展地完成多用户邮箱与密码的结构化解析,为自动化登录、批量测试或数据迁移提供可靠基础。











