Southern Bear |
Отправлено: 9 ноября 2010 — 02:28
|
Newbie
Покинул форум
Сообщений всего: 19
Дата рег-ции: Июль 2010
Репутация: 7
|
Хотелось бы вернуться к теме 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" местах). Как с этим бороться, непонятно. Разве что, в сообщении с магнетом отключать смайлы.(Отредактировано автором: 9 ноября 2010 — 18:27) |
|
|
Poison |
Отправлено: 10 января 2011 — 00:16
|
Newbie
Покинул форум
Сообщений всего: 20
Дата рег-ции: Нояб. 2010
Репутация: 0
[+][+]
|
yura3d
я брал файлы form_code.tpl, fm.class.php, lang_front_formcode.php
искал код для цвета шрифта, копировал, изменял цвета на названия шрифтов
после строки
CODE:"#\[color=\s*([A-Za-z]{3,10}|\#[A-Za-z0-9]{6})\s*\](.+?)\[/color\]#is",
вставил
CODE:"#\[font=\s*([A-Za-z]{3,10}|\#[A-Za-z]{6})\s*\](.+?)\[/font\]#is",
работать не захотело
потом вставил
CODE:"<span style=\"font-face: $1;\">$2</span>",
после
CODE:"<span style=\"color: $1;\">$2</span>",
все по аналогии со цветом |
|
|
|