Автоматическое формирование Magnet-ссылок

Недавно обкатал новую интересную функцию на DC портале. Для неё использовал в классе парсера функцию PHP «preg_replace_callback«. Суть функции заключается в том что она берёт параметром функцию обратного вызова ко всем найденным выражениям и найденное заменяет тем что функция вернула.

Внутри функции заключил 2 функции: первая, format_size, формирует размер, кстати вот она:

function format_size ($size, $arr=false)
{
 $units = '';
 if ($size < = 1024)
 {
 $units = "b";
 } else {
	if ($size < 1048576) # 1024^2
	{
	$units = "Kb";
	$size = $size/1024;
 
 } else {
  if ($size < 1073741824) # 1024^3
  {
    $units = "Mb";
    $size = $size/(1048576);
	} else {
	 if ($size < 1099511627776) # 1024^4
		{
		$units = "GB";
		$size = $size/(1073741824);
		} else {
		  if ($size < 1125899906842624) # 1024^5
		    {
		    $units = "Tb";
		    $size = $size/(1099511627776);
		    } else {
		    $units = "Eb";
		    $size = $size/(1125899906842624); # 1024^5
				}
				}
			}
		}
	};
 
	if ($arr)
		return array(round($size,2),$units);
	else
		return round($size,2).' '.$units;
}

Вторая, rep_magnet, берёт этот размер и формирует, собственно Magnet-ссылку.

function rep_magnet ($s)
{
if (@$s[1]) return $s[0]; // If have '[url=' at the start - return not modiffed string
$link = $s[0];
$link = str_replace ('"', '"', $link);
$name = htmlspecialchars(urldecode($s[4]));
$size = format_size($s[3]);
return '<img src="/favicon.png/" alt="" /><a href="'.$link.'">Скачать файл из DC++: <strong>'.$name.'</strong></a> ('.$size.')';
}

Если функция находит символ равно, в регулярном выражении, обработки не происходит, сделанно, для экранирования ссылок заключённых в тег [url и воизбежании повторного парсинга.

В итоге получается такая регулярка:

$source = preg_replace_callback ('/([=\'"`])?magnet:\?xt=urn:tree:tiger:([a-z0-9]+)&amp;xl=([0-9]+)&amp;dn=([^&lt;\s\[\]]+)/uims', 'rep_magnet', $source );

Вот так это выглядит в работе:

d0b1d0b5d0b7-d0b8d0bcd0b5d0bdd0b81

  • Трэкбеки закрыты
  • Комментарии (3)
    • Peter
    • 24 декабря, 2008

    Шож форматирование такое ужашное?

  1. «if ($size <= 1024)»

    Это что за палево? )

  2. Да это здешний тапограф, мать его, никак не отлажу.



Введите код с картинки