Делая очередной парсер натолкнулся на ситуацию когда почтовик шифровали и приводили его в читабельный вид с помощью JavaScript. Всё бы ничего, но парсил cUrl-ом, а он JS не понимает. Впринципе, мне повезло. Я нашел в гугле исходники на хабре.
Да, на хабре были функции кодирования и декодирования на JS и была фунька кодирования на PHP, но мне то надо было обратное. В силу того, что знаний по JS кот наплакал, потерял много времени на понимание самого процесса декодирования. Как только понял суть работы каждой фуньки, тогда стало все ясно 🙂
Внимание! Для целостности смысла заметки будет копипаст.
Функции на JS
function encode(email, text, tpl) {
var t = tpl.replace(/{e}/g, email);
var a = t.replace(/{text}/g, text);
t = "";
for (i = 0; i < a.length; i++) {
if (a.charCodeAt(i) <= 127) {
t += (String.fromCharCode(Math.floor(a.charCodeAt(i) / 16) + 65))
t += (String.fromCharCode(a.charCodeAt(i) % 16 + 65));
} else {
t += a.charAt(i);
}
}
return t;
}
function decode(a) {
var t = "";
for (i = 0; i < a.length; i++) {
if (a.charCodeAt(i) <= 127) {
t += String.fromCharCode((a.charCodeAt(i) - 65) * 16 + (a.charCodeAt(++i) - 65))
} else {
t += a.charAt(i);
}
}
return t;
}
Кодируем:
encode("name@domain.com", "Имя", "<a href=\"mailto:{e}\">{text}</a>");
Получаем:
DMGBCAGIHCGFGGDNCCGNGBGJGMHEGPDKGOGBGNGFEAGEGPGNGBGJGOCOGDGPGNCCDOИмяDMCPGBDO
Декодируем:
decode("DMGBCAGIHCGFGGDNCCGNGBGJGMHEGPDKGOGBGNGFEAGEGPGNGBGJGOCOGDGPGNCCDOИмяDMCPGBDO");
Получаем:
<a href="mailto:name@domain.com">Имя</a>
Функции на PHP
function encode_email($email, $text = null, $tpl = null)
{
if (empty($email)) return false;
if ($tpl === null) $tpl = "<A HREF=\"mailto:{e}\">{text}</A>";
if ($text === null) $text = $email;
$t = str_replace('{e}', $email, $tpl);
$a = str_replace('{text}', $text, $t);
$result = '';
for($i = 0; $i < strlen($a); $i++) {
if (ord($a[$i]) <= 127) {
$result .= chr(floor(ord($a[$i]) / 16) + 65)
. (string)chr(ord($a[$i])%16 + 65);
} else {
$result .= (string)$a[$i];
}
}
}
function decode_email($a)
{
$result = '';
for($i = 0; $i < strlen($a); $i++) {
if (ord($a[$i]) <= 127) {
$result .= chr((ord($a[$i]) - 65) * 16 + (ord($a[++$i]) - 65));
} else {
$result .= ord($a[$i]);
}
}
return $result;
}
Кодируем:
print_r(encode_email('name@domain.com'));
Получаем:
DMGBCAGIHCGFGGDNCCGNGBGJGMHEGPDKGOGBGNGFEAGEGPGNGBGJGOCOGDGPGNCCDOИмяDMCPGBDO
Декодируем:
print_r(encode_email("DMGBCAGIHCGFGGDNCCGNGBGJGMHEGPDKGOGBGNGFEAGEGPGNGBGJGOCOGDGPGNCCDOИмяDMCPGBDO"));
Получаем:
<a href="mailto:name@domain.com">Имя</a>
17 августа, 2013


