Ответов: 203 Просмотров: 0
|
Хотелось бы вернуться к теме magnet-ссылок.
Можно ли сделать их отображение более человечным?
Сам я на php писать не умею, по этому просто набросал для иллюстрации мысли по этому поводу в формате "лишь бы работало".
мысли (Отобразить)CODE:<?php
function magnet_parser($matches) {
/*
dn (Display Name) — Имя файла
xl (eXact Length) — Размер файла в байтах
dl (Display Length) — Отображаемый размер в байтах
*/
preg_match('#(?<=(xl=))[0-9]+#is', $matches[1], $mmatches);
$xl = $mmatches[0]; //Размер файла
preg_match('#(?<=(dl=))\d\w+#is', $matches[1], $mmatches);
$dl = 0;
if ($mmatches) { $dl = $mmatches[0]; } //Отображаемый размер
preg_match('#(?<=(dn=))\S+#is', $matches[1], $mmatches);
$dn = iconv('UTF-8', 'CP1251', htmlspecialchars(urldecode($mmatches[0])));
if ($dl > 0) {
$dn = preg_replace('#(?<=(\.dcls))(\S+)#is', '', $dn);
$xl = $dl;
}
$metrics[0] = 'bytes';
$metrics[1] = 'KB';
$metrics[2] = 'MB';
$metrics[3] = 'GB';
$metrics[4] = 'TB';
$metric = 0;
while(floor($xl/1024) > 0) {
++$metric;
$xl /= 1024;
}
$xl = round($xl,2).' '.(isset($metrics[$metric])?$metrics[$metric]:'??');
$str_replace = '<a href="'.$matches[1].'" title="magnet-ссылка">'.$dn.'</a> ('.$xl.')';
return $str_replace;
}
function makeMagnet($text) {
$str_search = '#\[magnet\](magnet\:\?xt=urn:tree:tiger:.*?&xl=.*?&dn=[^\[][a-zA-Z0-9%.\+\-\(\)\'&;=_!]+)\[/magnet\]#is';
preg_match($str_search, $text, $matches);
if ($matches) {
return preg_replace_callback($str_search, "magnet_parser", $text);
} else {
return $text;
}
}
//-----------------------------------------------------------------------------------
$str_text = '[magnet]magnet:?xt=urn:tree:tiger:SYNILV2P3JW5AZMWHBTLWCGHQOJQA6FEEISUEJI&xl=1154691760&dn=%D0%92%D0%BE%D0%B9%D0%BD%D0%B0+08.08.08.+%D0%98%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%BE+%D0%BF%D1%80%D0%B5%D0%B4%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%B0+(2008)+720p+HDTV.mp4[/magnet]';
echo makeMagnet($str_text).'<br>';
$str_text = '[magnet]magnet:?xt=urn:tree:tiger:DTRTFEZWJNPK5VH6CYFVNKYWD6BQT3Z76YJJSZI&xl=14104&dn=%D0%A3%D0%B4%D0%B0%D1%80%D0%BD%D0%B0%D1%8F+%D1%81%D0%B8%D0%BB%D0%B0.dcls&dl=72347561549[/magnet]';
echo makeMagnet($str_text).'<br>';
?>
Результат переосмысления. Если макнет такой, как описан, будет приведён в божеский вид, если нет, то всё как было изначально. Осталось понять, сколько сделано ошибок.
CODE:function magnet($matches) {
preg_match('/(magnet\:\?xt=urn:tree:tiger:.*?&xl=.*?&dn=[^\[][a-zA-Z0-9%.\+\-\(\)\'&;=_!]+)/is', $matches[1], $mmatches);
if ($mmatches) {
preg_match('/(?<=(xl=))([0-9]+)/is', $matches[1], $mmatches);
$xl = $mmatches[2]; //Размер файла
preg_match('/(?<=(dl=))(\d\w+)/is', $matches[1], $mmatches);
$dl = 0;
if ($mmatches) { $dl = $mmatches[2]; } //Отображаемый размер
preg_match('/(?<=(dn=))(\S+)/is', $matches[1], $mmatches);
$name = iconv('UTF-8', 'CP1251', htmlspecialchars(urldecode($mmatches[2])));
if ($dl > 0) {
$name = preg_replace('/(?<=(\.dcls))(\S+)/is', '', $name);
$xl = $dl;
}
$metrics[0] = 'bytes';
$metrics[1] = 'KB';
$metrics[2] = 'MB';
$metrics[3] = 'GB';
$metrics[4] = 'TB';
$metric = 0;
while(floor($xl/1024) > 0) {
++$metric;
$xl /= 1024;
}
$xl = round($xl,2).' '.(isset($metrics[$metric])?$metrics[$metric]:'??');
return '<a href="'.$matches[1].'" title="magnet-ссылка">'.$name.'</a> ('.$xl.')';
} else {
return '<a href="'.$matches[1].'">'.chunk_split($matches[1]).'</a>';
}
}
Как показала практика, отображение получилось (при минимальной коррекции мыслей). Только смайлы иногда вылазят (в частности, вот в таких "tree:tiger:DTR" местах). Как с этим бороться, непонятно. Разве что, в сообщении с магнетом отключать смайлы. |