Скрипты-полезняшки

В этом посте предлагаю выкладывать всякие часто употребляемые PHP и JS скриптики.
Основное условие - маленькие и изящные. Не надо тут классов, библиотек и пр. туфты. Не забываем краткое описание и бибикод [php].
Картинка по запросу "полезняшки"

начнем с часто нужной функции конвертации из UTF-8 в Windows-1251 и обратно. На хостингах довольно часто не стоят всякие дурацкие мбконверты и айконверты.

<?php
function Utf8ToWin($fcontents) {
    
$out $c1 '';
    
$byte2 false;
    for (
$c 0;$c strlen($fcontents);$c++) {
        
$i ord($fcontents[$c]);
        if (
$i <= 127) {
            
$out .= $fcontents[$c];
        }
        if (
$byte2) {
            
$new_c2 = ($c1 3) * 64 + ($i 63);
            
$new_c1 = ($c1 >> 2) & 5;
            
$new_i $new_c1 256 $new_c2;
            if (
$new_i == 1025) {
                
$out_i 168;
            } else {
                if (
$new_i == 1105) {
                    
$out_i 184;
                } else {
                    
$out_i $new_i 848;
                }
            }
            
$out .= chr($out_i);
            
$byte2 false;
        }
        if ((
$i >> 5) == 6) {
            
$c1 $i;
            
$byte2 true;
        }
    }
    return 
$out;
}

function 
WinToUtf8($s) {
  
$t '';
  for (
$i 0$m strlen($s); $i $m$i++) {
    
$c ord($s[$i]);
    if (
$c <= 127) { $t .= chr($c); continue; }
    if (
$c >= 192 && $c <= 207) { $t .= chr(208) . chr($c 48); continue; }
    if (
$c >= 208 && $c <= 239) { $t .= chr(208) . chr($c 48); continue; }
    if (
$c >= 240 && $c <= 255) { $t .= chr(209) . chr($c 112); continue; }
    if (
$c == 184) { $t .= chr(209) . chr(209); continue; };
    if (
$c == 168) { $t .= chr(208) . chr(129); continue; };
  }
  return 
$t;
}
?>

 (0) Написал recoilme, 2008-08-06 11:30:53  ответить

javascript определения IE. Точнее одна строка). В отличии от классических методов, даже если дефолтный браузер стоит, например FF, а зашли через IE - вернет корректно:



<?php
if (window.attachEvent && navigator.userAgent.indexOf('Opera') === -1)//IE
?>



(0)  Написал recoilme, 2008-08-06 11:45:02  ответить

Ещё один javascript, вставки текста в текстовое поле. Например тут этот скрипт срабатывает при клике на "Ответить"



<?php

    
function voidPutATag(Tag,Tag2)
    {
        if (
window.attachEvent && navigator.userAgent.indexOf('Opera') === -1) {
            
document.commentform.msg_body.focus();
            
sel document.selection.createRange();
            
sel.text Tag+sel.text+Tag2;
            
document.commentform.msg_body.focus();
        }
        else {
              var 
ss document.commentform.msg_body.scrollTop;
              
sel1 document.commentform.msg_body.value.substr(0document.commentform.msg_body.selectionStart);
              
sel2 document.commentform.msg_body.value.substr(document.commentform.msg_body.selectionEnd);

              
sel document.commentform.msg_body.value.substr(document.commentform.msg_body.selectionStart,
                                  
document.commentform.msg_body.selectionEnd document.commentform.msg_body.selectionStart);

              var 
text document.commentform.msg_body.firstChild;
              
document.commentform.msg_body.value sel1 Tag sel Tag2 sel2;

              
selPos Tag.length sel1.length sel.length Tag2.length;
              
document.commentform.msg_body.setSelectionRange(sel1.lengthselPos);
              
document.commentform.msg_body.scrollTop ss;
        }
    }

//пример использования

&lt;body&gt;
<
a href="[removed] voidPutATag('<b<','</b<')">b</a>
<
p>

&
lt;form name="commentform" method="post"&gt;
&
lt;textarea name="msg_body"&gt;
&
lt;/textarea&gt;
&
lt;/form&gt;
</
p>

&
lt;/body&gt;

?>



(0)  Написал recoilme, 2008-08-06 11:49:45  ответить

2recoilme: XSS в предыдущем посте вырезался, но идея думаю ясна.

(0)  Написал recoilme, 2008-08-06 11:51:33  ответить

Склонялка комментариев:



<?php        function comment_cnt_str($cnt)
        {
            
$cnt intval($cnt);
            
$lastdigg intval(substr(strval($cnt), -1));
            switch(
$lastdigg):
            case (
1):
                
$commentstr "комментарий";
                break;
            case (
2):
            case (
3):
            case (
4):
                
$commentstr "комментария";
                break;
            default :
                
$commentstr "комментариев";
                break;
            endswitch;
            if (
$cnt>10 and $cnt<21$commentstr "комментариев";
            return 
$commentstr;
        }
?>





Иногда катит Plural.



<?phpfunction pluralForm($n$form1$form2$form5

    
$n abs($n) % 100
    
$n1 $n 10
    if (
$n 10 && $n 20) return $form5
    if (
$n1 && $n1 5) return $form2
    if (
$n1 == 1) return $form1
    return 
$form5

 
// пример использования 
echo “В Вашем почтовом ящике $n “.pluralForm($n“письмо”“письма”“писем”); ?>



(0)  Написал recoilme, 2008-08-06 11:56:43  ответить

strtolower с этими функциями нифига не пашет:



echo WinToUtf8(strtolower(Utf8ToWin('ЕбАнЫвРоТ !!!!')));



Зато пашет такая сердитая функция:



/* Solution to the Cyrillic and uft-8 */

function cyrillic_strtolower($word) {



$alfavitlover = explode(',', '¸,é,ö,ó,ê,å,í,ã,ø,ù,ç,õ,ú,ô,û,â,à,ï,ð,î,ë,ä,æ,ý,ÿ,÷,ñ,ì,è,ò,ü,á,þ');

$alfavitupper = explode(',', '¨,É,Ö,Ó,Ê,Å,Í,Ã,Ø,Ù,Ç,Õ,Ú,Ô,Û,Â,À,Ï,Ð,Î,Ë,Ä,Æ,Ý,ß,×,Ñ,Ì,È,Ò,Ü,Á,Þ');



for($wr = 0; $wr <= count($alfavitlover); $wr++) {

$word = str_replace($alfavitupper[$wr], $alfavitlover[$wr], $word);

}



return $word;

}

echo strtolower('ЕбАнЫвРоТ !!!!');

(0)  Написал skachko, 2008-08-06 11:57:28  ответить

С момента публикации прошло... :



<?php
    
function nice_time($ts) {
        
$result = array();
        
        
$y floor($ts 31536000);
        if (
$y) {
            
$ts -= $y 31536000;
            
$result[] = $y plural($y' год'' года'' лет');
        }
        
        
$y floor($ts 2592000);
        if (
$y) {
            
$ts -= $y 2592000;
            
$result[] = $y plural($y' месяц'' месяца'' месяцев');
        }
        
        
$y floor($ts 86400);
        if (
$y) {
            
$ts -= $y 86400;
            
$result[] = $y plural($y' день'' дня'' дней');
        }
        
        
$y floor($ts 3600);
        if (
$y) {
            
$ts -= $y 3600;
            
$result[] = $y plural($y' час'' часа'' часов');
        }
        
        
$y floor($ts 60);
        if (
$y) {
            
$ts -= $y 60;
            
$result[] = $y plural($y' минуту'' минуты'' минут');
        }
        
        return 
join(', '$result);
        
    }

    echo 
'С момента публикации прошло '  nice_time(time() - $public_time); 
?>



(0)  Написал recoilme, 2008-08-06 11:58:28  ответить

2skachko: Ты наверно хотел сказать это в ЮТИЭФ)

str2lower в UTF8:



<?php
&lt;?php
//solution to the Cyrillic and uft-8
function strtolower_Cyrillic($word) {
    
$alfavitlover explode(',''ё,й,ц,у,к,е,н,г,ш,щ,з,х,ъ,ф,ы,
    в,а,п,р,о,л,д,ж,э,я,ч,с,м,и,т,ь,б,ю'
);
    
$alfavitupper explode(',''Ё,Й,Ц,У,К,Е,Н,Г,Ш,Щ,З,Х,Ъ,Ф,Ы,
    В,А,П,Р,О,Л,Д,Ж,Э,Я,Ч,С,М,И,Т,Ь,Б,Ю'
);
    for(
$wr=0;$wr<=count($alfavitlover);$wr++) {
        
$word str_replace($alfavitupper[$wr], $alfavitlover[$wr], $word);
    }
    return 
$word;
}
echo 
strtolower_Cyrillic('СаШа+МаШа');
?&
gt;
?>



(0)  Написал recoilme, 2008-08-06 12:00:35  ответить

Преобразует все строки вида http:// в ссылки, если строка заканчивается на gif и т.п. - в картинки, а если человек написал тег


<?php
        
function urlprocess($text="")
        {
                
//$processedtxt = preg_replace("/[^(\"'>)][wW]{3}[.][a-zA-z.\/0-9-+?=&%;]*/"," <a href=\"\\">".strtoupper('$0')."</a> ",$text);
                
$text $this->bb_parse($text);
                if (
strpos(strtolower("1".$text),"<a")>or strpos(strtolower("1".$text),"<img")>0){
                    return 
$text;
                } else {
                    
$processedtxt preg_replace_callback(
                        
"#[^(\"')]?[hHtTpP]{4}[:]\/\/[a-zA-z.\/0-9-+?=:,@&~$%\#\[\];]*#",
                        
create_function('$matches',
                            
'$pos = strpos(strtolower($matches[0]),"http");$first=\'\';'.
                            
'if ($pos == 1) {$first=substr($matches[0],0,1); $matches[0] = substr($matches[0],1);}'.
                            
'if (strlen($matches[0])>25) $txt = substr($matches[0],0,25)."..."; else $txt = $matches[0];'.
                            
'$ext= substr(strtolower($matches[0]),strlen($matches[0])-3);'.
                            
'if ($ext == "gif" or $ext == "jpg" or $ext == "png") return "<img src=\"$matches[0]\">";'.
                            
'else return "$first<noindex><a rel=\"nofollow\" target=_blank href=\"$matches[0]\">$txt</a></noindex>";'),$text);
                    return 
$processedtxt;
                }
        }
?>



(0)  Написал recoilme, 2008-08-06 12:04:15  ответить

2recoilme: а если написал тегами ссылку - то выключается. Вобщем этот сайт яркий пример применения большинства вышеперечисленных функций. Ищите и обрящете. А также велкам если у вас есть чем поделиться.

(0)  Написал recoilme, 2008-08-06 12:07:40  ответить