Получение множественной формы русского слова

<?php
/**
 * Получение множественной формы русского слова
 * автор: Nc_Soft
 * 18.08.09
 * 
 */

/**
 * $n - число
 * $form1 - для одной штуки
 * $form2 - для двух штук
 * $form5 - для пяти штук
 */
function pluralForm($n, $form1, $form2, $form5) {
	$n = abs($n) % 100;
	$n1 = $n % 10;
	if ($n > 10 && $n < 20) return $form5;
	if ($n1 > 1 && $n1 < 5) return $form2;
	if ($n1 == 1) return $form1;
	return $form5;
}

//пример
echo '38 ' . pluralForm(38, 'попугай', 'попугая', 'попугаев');
?>
18 августа 2009, 12:54

Удаление пустых элементов из массива

<?php
/**
 * Удаление пустых элементов из массива
 * автор: Nc_Soft
 * 23.07.09
 */

/*встроенной функции, которая это делает вроде как не существует, 
но можно обойтись комбинацией их двух встроенных*/
$array = array('aa', 'bb', 'cc', '', 'dd', ' ', 3, 5, 'ee');

//вариант 1
$array1 = array_filter($array, 'trim');

//вариант 2
$array2 = array_diff($array, array('', ' '));

print_r($array1);
print_r($array2);
23 июля 2009, 21:47

Отображение php ошибок и предупреждений

/*
* Отображение php ошибок и предупреждений
* автор: Nc_Soft
* 19.07.09
*/

//в рабочем проекте это должно быть выведено в 0
php_value display_errors 1
php_value error_reporting 2047
19 июля 2009, 03:46

Исправление кодировки букв "ш" и "И" в MYSQL

/*
* Исправление кодировки букв "ш" и "И" в MYSQL
* автор: Nc_Soft
* 18.07.09
*/

/*
Частенько встречается при переносе бд, либо при шаманстве с кодировками
буквы "ш" и "И" оказываются битыми (речь идет о utf-8 конечно)
буква "ш" = chr(209).chr(63) / правильно chr(209).chr(136)
буква "И" = chr(208).chr(63) / правильно chr(208).chr(152)
Чтобы пофиксить делаем 2 запроса
*/

UPDATE `tbl` SET `pole` = REPLACE(
`pole`, 
CONCAT( CHAR(209), CHAR(63) ), 
CONCAT( CHAR(209), CHAR(136) )
);

UPDATE `tbl` SET `pole` = REPLACE(
`pole`, 
CONCAT( CHAR(208), CHAR(63) ), 
CONCAT( CHAR(208), CHAR(152) )
);
18 июля 2009, 22:31

Установка предопределенного значения autoincrement

<?php
/**
 * Установка предопределенного значения autoincrement
 * автор: Nc_Soft
 * 08.07.09
*/

/*
часто бывает нужно выставить вразумительно значение автоиндекса,
поэтому публикую запрос, чтобы не забыть
(в phpmyadmin: операции - параметры таблицы - AUTO_INCREMENT)
*/

mysql_query ("alter table tbl auto_increment=10");
?>
8 июля 2009, 04:15

Защита от прямых ссылок

# Защита от прямых ссылок
# автор: Nc_Soft
# 05.07.09
# Это позволит скачать ваш файл только с вашего сайта.
# надо создать вот такой .htaccess

RewriteEngine on
RewriteBase / 

# если надо разрешить скачку при пустом рефере раскомментируйте это
# RewriteCond %{HTTP_REFERER} !^$

# Дальше список идет набор разрешенных доменов
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?snippets.pp.ru [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?wen.ru [NC]

# Форматы файлов, для которых устанавливается защита (например, mp3)
RewriteRule .(mp3)$ http://ya.ru

#Все запросы на http://snippets.pp.ru/1.mp3 перекинутся на http://ya.ru
5 июля 2009, 02:10

Google translate переводчик

<?php
/**
* Google translate переводчик
* автор: Nc_Soft, Soft_Land
* 22.06.09
*/

class GoogleTranslate {  
     
    static function translate($text, $source, $dest) { 
        $text    =    urlencode($text); 
        $ch        =    curl_init('http://translate.google.ru'); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
        curl_setopt($ch, CURLOPT_POST,1); 
        curl_setopt($ch, CURLOPT_POSTFIELDS, "text=$text&sl=$source&tl=$dest"); 
        curl_setopt($ch, CURLOPT_HEADER, 1); 
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.3) Gecko/2008092417'); 

        $r        =    curl_exec($ch); 

        $arr    =    array(); 
        preg_match("|<textarea name=utrans wrap=SOFT dir=\"ltr\" id=suggestion style=\"width:80%;margin:5px 0;overflow:auto\">(.*)</textarea>|sU", $r, $arr); 

        return strip_tags(str_replace('<br>', "\n", htmlspecialchars_decode($arr[1]))); 
    } 
     
}

echo GoogleTranslate::translate('Read this fucking manual', 'eng', 'ru');

//ps Спасибо SL за подробный языковой массив.
?>
22 июня 2009, 08:48

Вызов preg_replace_callback в классе

<?php
/**
 * Вызов preg_replace_callback в классе
 * автор: Nc_Soft
 * 11.06.09
 */

/* Рассмотрим на примере смайлов
условия: смайлов должно быть не более 3 в одном сообщении
смайлы вызываются как-то так :smile:
*/

class Smiles {
	//счетчик смайлов
	static $smc=0;

	//список смайлов
	static $smiles=array(
	'smile', 'hi', 'yes', 'bad', //итд
	);

	//функция печатающая текст (обратите внимание на callback вызов)
	static function pr($str) {
		return preg_replace_callback('`:([^\s]+):`U', array('self', 'cbs'), $str);
	}

	//функция обратного вызова для регулярного выражения
	//проверяет список смайлов и их количество
	static function cbs($v) {

		if (self::$smc<3) {
			if (in_array(strtolower($v[1]), self::$smiles)) {
				self::$smc++;
				return '<img src="/smiles/'.$v[1].'.gif" alt="'.$v[1].'"/>';
			}
		}

		return $v[0];
	}
}

//пример
echo Smiles::pr('Тут текст со смайлами (неверный смайл :error: )
:smile: :hi: :yes: :bad: ');
11 июня 2009, 17:04

Распаковка страницы в gzip

<?php
/**
 * Распаковка страницы в gzip
 * автор: Nc_Soft
 * 29.05.09
 * 
*/

//получаем страницу, где поддерживается сжатие
$ch=curl_init('http://snippets.pp.ru/');

//настраиваем, чтобы сеанс выводился не в браузер, а в переменную
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

//заголовки тут ни к чему
//curl_setopt($ch, CURLOPT_HEADER, 1);

//задаем заголовок для сжатия Accept-Encoding: gzip, deflate
//и еще несколько заголовков за компанию (необязательно)
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Accept-Encoding: gzip, deflate',
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language: ru,en-us;q=0.7,en;q=0.3',
'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7',
));

//выполняем запрос
$res = curl_exec($ch);

//закрываем сеанс cURL
curl_close($ch);

//в переменной $res у нас сжатые данные в "кракозябрах", проверка
echo $res;

//разделитель для читабельности
echo "<br /><br />\n\n";

/*самое важное: чтобы раскодировать данные надо применить функцию
gzinflate, обрезав при этом первые 10 байт!*/
echo gzinflate(substr($res, 10));

/*
Результат можно увидеть запустив snippet.
Что нам это дает?
С серверов, где поддерживается сжатие можно тащить примерно в 10 раз
меньше данных, чем раньше, тоесть грабберы будут работать шустрее.

Ну и конечно, snippets не появляются из ниоткуда, 
каждый snippet решает проблему из "жизни", пример:
echo file_get_contents('http://radiorecord.ru/charts/');
Почему-то хоть убей выдается не вся страница, а примерно половина.
Запрос с использованием заголовка Accept-Encoding: gzip, deflate
позволяет получить страницу целиком, хоть и в сжатом виде.
*/
29 мая 2009, 03:02

Время в iso формате

<?php
/**
 * Время в iso формате
 * автор: Nc_Soft
 * 27.05.09
 */

/*Функция форматирует дату из бд (поле timestamp или datetime) в формат iso
с учетом временного сдвига.
Сдвиг отсчитывается от локального времени системы, а не по Гринвичу*/

function date_iso($data, $shift='+0') {
	
	$data=date('Y-m-d H:i:s', strtotime("$data $shift hour"));
	$p=date_parse($data);

	if ($p['error_count']) return ;

	static $m_collation=array(
	'января',
	'февраля',
	'марта',
	'апреля',
	'мая',
	'июня',
	'июля',
	'августа',
	'сентября',
	'октября',
	'ноября',
	'декабря',
	);

	return '<span class="time">'.$p['day'].' '.
	$m_collation[$p['month']-1].' '.
	$p['year'].', '.
	sprintf('%02d', $p['hour']).':'.sprintf('%02d', $p['minute']).'</span>';
}

echo '<br />Дата на пробу<br />';
echo date_iso('2009-05-27 01:53:32');

echo '<br />А теперь сдвинем на час вперед<br />';
echo date_iso('2009-05-27 01:53:32', '+1');

echo '<br />И на 3 часа назад<br />';
echo date_iso('2009-05-27 01:53:32', '-3');
27 мая 2009, 02:03

Настройка .htaccess для wap сайта

# Настройка .htaccess для wap сайта
# автор: Nc_Soft
# 18.05.09

#отключаем глобальные переменные
php_value register_globals off

#отключаем экранирование данных
php_value magic_quotes_gpc off

#автоматически цепляем сессию, если она используется
php_value session.use_trans_sid on

#используем кукис в сессиях
php_value session.use_cookies 1

#некоторые мобилы кукис не держат, поэтому создаем альтернативу
php_value session.use_only_cookies 0

#полезно для валидатора
php_value arg_separator.output "&"

#цепляем сид к следующим параметрам
php_value url_rewriter.tags  "a=href,area=href,img=src,fieldset="

#ну и несколько mime типов для примера
AddType text/vnd.sun.j2me.app-descriptor .jad
AddType application/java-archive .jar
AddType application/vnd.eri.thm .thm
AddType application/vnd.nok.s40theme .nth
AddType application/vnd.siemens-mp.theme .sdt
AddType application/vnd.smaf .mmf
AddType application/vnd.symbian.install .sis
AddType video/3gpp .3gp
AddType video/mp4 .mp4
AddType video/x-msvideo .avi
18 мая 2009, 14:26

Определение баланса сайта на bn.wen.ru через xml интерфейс

<?php
/**
 * Определение баланса сайта на bn.wen.ru через xml интерфейс
 * автор: Nc_Soft
 * 12.04.09
 */

//формируем запрос
$xml='<?xml version="1.0" encoding="utf-8"?>
<request login="ваш логин" password="ваш пароль" do="balance">
<site>ид сайта</site>
</request>';

//шлем данные
$ch=curl_init('http://bn.wen.ru/');
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,'body='.urlencode($xml));
echo $s=curl_exec($ch);

$s=simplexml_load_string($s);
//выводим баланс
echo $s->balance;

//полное описание на http://b.wen.ru/xml.txt, здесь лишь практический пример
12 апреля 2009, 23:52

Определение параметров mp3 файла

<?php
/**
 * Определение параметров mp3 файла
 * автор: Nc_Soft
 * 12.04.09
 */

/*Не знаю как вас, а меня бесит библа getid,
поэтому параметры я определяю через ffmpeg*/

$ff=new ffmpeg_movie('file.mp3');

//длительность (с)
echo $ff->getDuration();

//аудио битрейт
echo $ff->getAudioBitRate();

//Возвратит поле "авторское право" из аудио или видео файла
echo $ff->getCopyright();

//Возвратит ID3 поле "Артист" из mp3 файла
echo $ff->getArtist();

//Возвратит ID3 поле "Жанр" из mp3 файла
echo $ff->getGenre();

//Возвратит ID3 поле "номер дорожки" из mp3 файла
echo $ff->getTrackNumber();

//Возвратит ID3 поле "Год" из mp3 файла
echo $ff->getYear();

//Возвратит  название  аудио  кодека  который использован видео файл как строку
echo $ff->getAudioCodec();

//Возвратит  количество  аудио каналов (1 моно 2 стерео и т д) как целое число
echo $ff->getAudioChannels();

/*моя функция форматирования времени трека*/
function dur($d) {
	if ($d<60) {
		return '00:'.sprintf('%02d',$d);
	}

	$s=$d%60;
	return sprintf('%02d',($d-$s)/60).':'.sprintf('%02d',$s);
}
//пример 
echo dur('105'); //01:45
12 апреля 2009, 23:39

Буквенные сокращения стран

<?php
/**
 * Буквенные сокращения стран
 * автор: Nc_Soft
 * 27.03.09
 */

$country=array(
'AC' => 'Ascension Island (остров Вознесения)', 
'AD' => 'Andorra (Андорра)', 
'AE' => 'United Arab Emirates (Объединенные Арабские Эмираты)', 
'AF' => 'Afghanistan (Афганистан)', 
'AG' => 'Antigua and Barbuda (Антигуа и Барбуда)', 
'AI' => 'Anguilla', 
'AL' => 'Albania (Албания)', 
'AM' => 'Armenia (Армения)', 
'AN' => 'Netherlands Antilles (Голланские Антильские острова)', 
'AO' => 'Angola (Ангола)', 
'AQ' => 'Antarctica (Антарктика)', 
'AR' => 'Argentina (Аргентина)', 
'AS' => 'American Samoa (Американское Самоа)', 
'AT' => 'Austria (Австрия)', 
'AU' => 'Australia (Австралия)', 
'AW' => 'Aruba (Аруба)', 
'AX' => 'Aland Islands (Аландские острова)', 
'AZ' => 'Azerbaijan (Азербайджан)', 
'BA' => 'Bosnia and Herzegovina (Босния и Герцеговина)', 
'BB' => 'Barbados (Барбадос)', 
'BD' => 'Bangladesh (Бангладеш)', 
'BE' => 'Belgium (Бельгия)', 
'BF' => 'Burkina Faso (Буркина-Фасо)', 
'BG' => 'Bulgaria (Болгария)', 
'BH' => 'Bahrain (Бахрейн)', 
'BI' => 'Burundi (Бурунди)', 
'BJ' => 'Benin (Бенин)', 
'BM' => 'Bermuda (Бермудские острова)', 
'BN' => 'Brunei Darussalam (Бруней)', 
'BO' => 'Bolivia (Боливия)', 
'BR' => 'Brazil (Бразилия)', 
'BS' => 'Bahamas (Багамские острова)', 
'BT' => 'Bhutan (Бутан)', 
'BV' => 'Bouvet Island', 
'BW' => 'Botswana (Ботсвана)', 
'BY' => 'Belarus (Беларусь)', 
'BZ' => 'Belize (Белиз)', 
'CA' => 'Canada (Канада)', 
'CC' => 'Cocos (Keeling) Islands (Кокосовые острова)', 
'CD' => 'Congo (Конго)', 
'CF' => 'Central African Republic (Центральноафриканская Республика)', 
'CG' => 'Congo (Конго)', 
'CH' => 'Switzerland (Швейцария)', 
'CI' => 'Cote dIvoire (Кот-дИвуар)', 
'CK' => 'Cook Islands (острова Кука)', 
'CL' => 'Chile (Чили)', 
'CM' => 'Cameroon (Камерун)', 
'CN' => 'China (Китай)', 
'CO' => 'Colombia (Колумбия)', 
'CR' => 'Costa Rica (Коста-Рика)', 
'CS' => 'Serbia and Montenegro (Сербия и Черногория)', 
'CU' => 'Cuba (Куба)', 
'CV' => 'Cape Verde (Кабо-Верде)', 
'CX' => 'Christmas Island (остров Рождества)', 
'CY' => 'Cyprus (Кипр)', 
'CZ' => 'Czech Republic (Чехия)', 
'DE' => 'Germany (Германия)', 
'DJ' => 'Djibouti (Джибути)', 
'DK' => 'Denmark (Дания)', 
'DM' => 'Dominica (Доминика)', 
'DO' => 'Dominican Republic (Доминиканская Республика)', 
'DZ' => 'Algeria (Алжир)', 
'EC' => 'Ecuador (Эквадор)', 
'EE' => 'Estonia (Эстония)', 
'EG' => 'Egypt (Египет)', 
'EH' => 'Western Sahara (Западная Сахара)', 
'ER' => 'Eritrea (Эритрея)', 
'ES' => 'Spain (Испания)', 
'ET' => 'Ethiopia (Эфиопия)', 
'FI' => 'Finland (Финляндия)', 
'FJ' => 'Fiji (Фиджи)', 
'FK' => 'Falkland Islands (Фолклендские острова)', 
'FM' => 'Micronesia (Микронезия)', 
'FO' => 'Faroe Islands (Фарерские острова)', 
'FR' => 'France (Франция)', 
'GA' => 'Gabon (Габон)', 
'GB' => 'United Kingdom (Соединенное Королевство Великобритании и Северной Ирландии)', 
'GD' => 'Grenada (Гренада)', 
'GE' => 'Georgia (Грузия)', 
'GF' => 'French Guiana (Французская Гвиана)', 
'GG' => 'Guernsey (остров Гернси)', 
'GH' => 'Ghana (Гана)', 
'GI' => 'Gibraltar (Гибралтар)', 
'GL' => 'Greenland (Гренландия)', 
'GM' => 'Gambia (Гамбия)', 
'GN' => 'Guinea (Гвинея)', 
'GP' => 'Guadeloupe (Гваделупа)', 
'GQ' => 'Equatorial Guinea (Экваториальная Гвинея)', 
'GR' => 'Greece (Греция)', 
'GS' => 'South Georgia and the South Sandwich Islands (Южная Джорджия и Южные Сандвичевы острова)', 
'GT' => 'Guatemala (Гватемала)', 
'GU' => 'Guam (Гуам)', 
'GW' => 'Guinea-Bissau (Гвинея-Бисау)', 
'GY' => 'Guyana (Гайана)', 
'HK' => 'Hong Kong (Гонконг)', 
'HM' => 'Heard and McDonald Islands', 
'HN' => 'Honduras (Гондурас)', 
'HR' => 'Croatia/Hrvatska (Хорватия)', 
'HT' => 'Haiti (Гаити)', 
'HU' => 'Hungary (Венгрия)', 
'ID' => 'Indonesia (Индонезия)', 
'IE' => 'Ireland (Ирландия)', 
'IL' => 'Israel (Израиль)', 
'IM' => 'Isle of Man (остров Мэн)', 
'IN' => 'India (Индия)', 
'IO' => 'British Indian Ocean Territory', 
'IQ' => 'Iraq (Ирак)', 
'IR' => 'Iran (Иран)', 
'IS' => 'Iceland (Исландия)', 
'IT' => 'Italy (Италия)', 
'JE' => 'Jersey (остров Джерси)', 
'JM' => 'Jamaica (Ямайка)', 
'JO' => 'Jordan (Иордания)', 
'JP' => 'Japan (Япония)', 
'KE' => 'Kenya (Кения)', 
'KG' => 'Kyrgyzstan (Кыргызстан)', 
'KH' => 'Cambodia (Камбоджа)', 
'KI' => 'Kiribati (Кирибати)', 
'KM' => 'Comoros (Коморские острова)', 
'KN' => 'Saint Kitts and Nevis (Сент-Китс и Невис)', 
'KP' => 'Korea (Северная Корея)', 
'KR' => 'Korea (Южная Корея)', 
'KW' => 'Kuwait (Кувейт)', 
'KY' => 'Cayman Islands (Каймановы острова)', 
'KZ' => 'Kazakhstan (Казахстан)', 
'LA' => 'Lao (Лаос)', 
'LB' => 'Lebanon (Ливан)', 
'LC' => 'Saint Lucia (Сент-Люсия)', 
'LI' => 'Liechtenstein (Лихтенштейн)', 
'LK' => 'Sri Lanka (Шри-Ланка)', 
'LR' => 'Liberia (Либерия)', 
'LS' => 'Lesotho (Лесото)', 
'LT' => 'Lithuania (Литва)', 
'LU' => 'Luxembourg (Люксембург)', 
'LV' => 'Latvia (Латвия)', 
'LY' => 'Libya (Ливия)', 
'MA' => 'Morocco (Марокко)', 
'MC' => 'Monaco (Монако)', 
'ME' => 'Montenegro (Монтенегро)',
'MD' => 'Moldova (Молдова)', 
'MG' => 'Madagascar (Мадагаскар)', 
'MH' => 'Marshall Islands (Маршалловы острова)', 
'MK' => 'Macedonia (Македония)', 
'ML' => 'Mali (Мали)', 
'MM' => 'Myanmar (Мьянма)', 
'MN' => 'Mongolia (Монголия)', 
'MO' => 'Macau (Макао)', 
'MP' => 'Northern Mariana Islands (Северные Марианские острова)', 
'MQ' => 'Martinique (Мартиника)', 
'MR' => 'Mauritania (Мавритания)', 
'MS' => 'Montserrat (Монтсеррат)', 
'MT' => 'Malta (Мальта)', 
'MU' => 'Mauritius (Маврикий)', 
'MV' => 'Maldives (Мальдивы)', 
'MW' => 'Malawi (Малави)', 
'MX' => 'Mexico (Мексика)', 
'MY' => 'Malaysia (Малайзия)', 
'MZ' => 'Mozambique (Мозамбик)', 
'NA' => 'Namibia (Намибия)', 
'NC' => 'New Caledonia (Новая Каледония)', 
'NE' => 'Niger (Нигер)', 
'NF' => 'Norfolk Island (Норфолк)', 
'NG' => 'Nigeria (Нигерия)', 
'NI' => 'Nicaragua (Никарагуа)', 
'NL' => 'Netherlands (Нидерланды)', 
'NO' => 'Norway (Норвегия)', 
'NP' => 'Nepal (Непал)', 
'NR' => 'Nauru (Науру)', 
'NU' => 'Niue', 
'NZ' => 'New Zealand (Новая Зеландия)', 
'OM' => 'Oman (Оман)', 
'PA' => 'Panama (Панама)', 
'PE' => 'Peru (Перу)', 
'PF' => 'French Polynesia (Французская Полинезия)', 
'PG' => 'Papua New Guinea (Папуа - Новая Гвинея)', 
'PH' => 'Philippines (Филиппины)', 
'PK' => 'Pakistan (Пакистан)', 
'PL' => 'Poland (Польша)', 
'PM' => 'Saint Pierre and Miquelon (Сен-Пьер и Микелон)', 
'PN' => 'Pitcairn Island (остров Питкэрн)', 
'PR' => 'Puerto Rico (Пуэрто-Рико)', 
'PS' => 'Palestine (Палестина)', 
'PT' => 'Portugal (Португалия)', 
'PW' => 'Palau (Палау)', 
'PY' => 'Paraguay (Парагвай)', 
'QA' => 'Qatar (Катар)', 
'RE' => 'Reunion Island (остров Реюньон)', 
'RO' => 'Romania (Румыния)', 
'RU' => 'Russian Federation (Россия)', 
'RW' => 'Rwanda (Руанда)', 
'SA' => 'Saudi Arabia (Саудовская Аравия)', 
'SB' => 'Solomon Islands (Соломоновы Острова)', 
'SC' => 'Seychelles (Сейшельские Острова)', 
'SD' => 'Sudan (Судан)', 
'SE' => 'Sweden (Швеция)', 
'SG' => 'Singapore (Сингапур)', 
'SH' => 'Saint Helena (остров Святой Елены)', 
'SI' => 'Slovenia (Словения)', 
'SJ' => 'Svalbard and Jan Mayen Islands', 
'SK' => 'Slovakia (Словакия)', 
'SL' => 'Sierra Leone (Сьерра-Леоне)', 
'SM' => 'San Marino (Сан-Марино)', 
'SN' => 'Senegal (Сенегал)', 
'SO' => 'Somalia (Сомали)', 
'SR' => 'Suriname (Суринам)', 
'ST' => 'Sao Tome and Principe (Сан-Томе и Принсипи)', 
'SU' => 'exUSSR (СССР)', 
'SV' => 'El Salvador (Сальвадор)', 
'SY' => 'Syria (Сирия)', 
'SZ' => 'Swaziland (Свазиленд)', 
'TC' => 'Turks and Caicos Islands', 
'TD' => 'Chad (Чад)', 
'TF' => 'French Southern Territories', 
'TG' => 'Togo (Того)', 
'TH' => 'Thailand (Таиланд)', 
'TJ' => 'Tajikistan (Таджикистан)', 
'TK' => 'Tokelau (Токелау)', 
'TL' => 'Timor-Leste', 
'TM' => 'Turkmenistan (Туркменистан)', 
'TN' => 'Tunisia (Тунис)', 
'TO' => 'Tonga (Тонга)', 
'TP' => 'East Timor (Восточный Тимор)', 
'TR' => 'Turkey (Турция)', 
'TT' => 'Trinidad and Tobago (Тринидад и Тобаго)', 
'TV' => 'Tuvalu (Тувалу)', 
'TW' => 'Taiwan (Тайвань)', 
'TZ' => 'Tanzania (Танзания)', 
'UA' => 'Ukraine (Украина)', 
'UG' => 'Uganda (Уганда)', 
'UK' => 'United Kingdom (Соединенное Королевство Великобритании и Северной Ирландии)', 
'UM' => 'United States Minor Outlying Islands', 
'US' => 'United States (США)', 
'UY' => 'Uruguay (Уругвай)', 
'UZ' => 'Uzbekistan (Узбекистан)', 
'VA' => 'Holy See, Vatican (Ватикан)', 
'VC' => 'Saint Vincent and the Grenadines (Сент-Винсент и Гренадины)', 
'VE' => 'Venezuela (Венесуэла)', 
'VG' => 'Virgin Islands, British (Виргинские острова, Британские)', 
'VI' => 'Virgin Islands, US (Виргинские острова, США)', 
'VN' => 'Vietnam (Вьетнам)', 
'VU' => 'Vanuatu (Вануату)', 
'WF' => 'Wallis and Futuna Islands', 
'WS' => 'Western Samoa (Западное Самоа)', 
'YE' => 'Yemen (Йемен)', 
'YT' => 'Mayotte', 
'YU' => 'Yugoslavia (Югославия)', 
'ZA' => 'South Africa (ЮАР)', 
'ZM' => 'Zambia (Замбия)', 
'ZW' => 'Zimbabwe (Зимбабве)'
);

/*Сам этот массив уже интересен и ценен, но в
качестве примера выведем русское название для страны RU*/
$strana=$country['RU'];
echo substr( strtok($strana, ')'), strpos($strana, '(') + 1);

?>
28 марта 2009, 14:56

Получение информации о Российском ip адресе

<?php
/**
 * Получение информации о Российском ip адресе
 * автор: Nc_Soft
 * 26.03.09
 */

/*
http://ipgeobase.ru наконец-то сделали xml сервис для определения параметров сетей.
Теперь узнать из каких городов ваши посетители стало еще проще!
Описание сервиса на http://blog.ipgeobase.ru/?p=37
Там обещано выложить примеры для разных языков программирования, но пока что
не выложено вообще никаких примеров, поэтому я и создал этот snippet
Нам понадобятся curl и simplexml
*/

//ип который тестим
$ip='81.18.122.149';

$data=<<<XML
<ipquery>
	<fields>
		<all/>
	</fields>
	<ip-list>
		<ip>$ip</ip>
	</ip-list>
</ipquery>
XML
;

$ch=curl_init('http://194.85.91.253:8090/geo/geo.html');
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$s=curl_exec($ch);
curl_close($ch);

//смотрим что отдал сервис
echo "<pre>\n";
echo htmlspecialchars($s);

//парсим ответ (можно регулярками, но зачем?)
$s=simplexml_load_string($s);

//выводим данные

echo 'диаппазон ';
echo $s->ip->inetnum;
echo "\n";
echo 'описание ';
echo $s->ip->{'inet-descr'};
echo "\n";
echo 'город ';
echo $s->ip->city;
echo "\n";
echo 'регион ';
echo $s->ip->region;
echo "\n";
echo 'округ ';
echo $s->ip->district;
echo "\n";
echo 'широта ';
echo $s->ip->lat;
echo "\n";
echo 'долгота ';
echo $s->ip->lng;

?>
28 марта 2009, 14:55

Генерация английского алфавита

<?php
/**
 * Генерация английского алфавита
 * автор: Nc_Soft
 * 10.03.09
 */

$letters=array();
for ($i=0; $i<26; $i++) {
	$letters[]=chr($i+65);
	$letters[]=chr($i+97);
}

print_r($letters);
?>
10 марта 2009, 13:01

Определение мобильного оператора

<?php
/**
 * Определение мобильного оператора
 * автор: Nc_Soft
 * Спасибо за помощь и критику Pиpиcу
 * 02.03.09
 */

/*-- ----------------------------
-- Table structure for oper
-- Таблица операторов
-- ----------------------------

CREATE TABLE `oper` (
  `id_oper` tinyint(4) unsigned NOT NULL auto_increment,
  `oper` varchar(255) NOT NULL,
  PRIMARY KEY  (`id_oper`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--тут прописываем опсосов
INSERT INTO `oper` VALUES ('1', 'Megafon');
INSERT INTO `oper` VALUES ('2', 'Beeline');
INSERT INTO `oper` VALUES ('3', 'Utel');
INSERT INTO `oper` VALUES ('4', 'BWC');
INSERT INTO `oper` VALUES ('5', 'MTS');
INSERT INTO `oper` VALUES ('6', 'TELE2');
--итд

-- ----------------------------
-- Table structure for ip
-- Таблица ip адресов
-- ----------------------------

CREATE TABLE `ip` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `id_oper` tinyint(4) unsigned NOT NULL,
  `astart` int(11) unsigned NOT NULL,
  `aend` int(11) unsigned NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `astart_aend` (`astart`,`aend`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--диаппазоны (для примера вбито 7 диаппазонов мегафона)
INSERT INTO `ip` VALUES ('', '1', '1402275840', '1402276863');
INSERT INTO `ip` VALUES ('', '1', '1402273792', '1402275839');
INSERT INTO `ip` VALUES ('', '1', '1402277888', '1402278911');
INSERT INTO `ip` VALUES ('', '1', '1402279936', '1402280959');
INSERT INTO `ip` VALUES ('', '1', '1402281984', '1402283007');
INSERT INTO `ip` VALUES ('', '1', '1402284032', '1402285055');
INSERT INTO `ip` VALUES ('', '1', '1402286080', '1402287103');
--итд
*/

//теперь представим, что зашел человек с ip=83.149.16.32
//определим его оператора
$q=mysql_query("SELECT o.id_oper, o.oper FROM ip i
LEFT JOIN oper o ON i.id_oper=o.id_oper
WHERE INET_ATON('83.149.16.32') BETWEEN i.astart AND i.aend LIMIT 1
");
$q=mysql_fetch_row($q);

//посмотрим что получилось
print_r($q);

?>
2 марта 2009, 22:27

Защита от граббера

<?php
/**
* Защита от граббера
* автор: Nc_Soft
* 25.02.09
*/

//Полуавтоматический вариант, позволяет обнаружить подозрительные ип
if ( fsockopen($_SERVER['REMOTE_ADDR'] ,80 ,$err ,$errno ,1) )
echo 'Возможно, это граббер, так как открыт порт 80';

/*
Здесь приведена лишь методика определения граббера, конечно, это не надо делать при
каждом запросе к скрипту. Лучше иметь список часто обращающихся ип и прогнать 
их через этот способ. Решение о бане можно принять только обратившись к whois серверу, 
потому что порт 80 открыт не только у хостеров, но и порой у обычных юзеров.
*/
26 февраля 2009, 00:12

Jad генератор на основе ZipArchive

<?php
/**
 * Jad генератор на основе ZipArchive
 * автор: Nc_Soft
 * 13.02.09
 */
$file = 'test.jar';
$jad = '';

//создаем объект
$z = new ZipArchive();

if ($z->open($file)) {
	$fp = $z->getStream('META-INF/MANIFEST.MF');
	if(!$fp) exit("не удалось открыть манифест");

	//читаем данные
	while (!feof($fp)) {
		$jad .= fread($fp, 200);
	}

	fclose($fp);

	//дописываем что надо
	$jad .= "\nMIDlet-Jar-Size: ".filesize($file)."\nMIDlet-Jar-URL: $file";

	//сохраняем
	file_put_contents('test.jad', $jad);
}

//А вообще, можно извлечь манифест еще проще
echo file_get_contents("zip://$file#META-INF/MANIFEST.MF");
//http://ru.php.net/manual/en/function.ziparchive-getstream.php
?>
13 февраля 2009, 17:26

1+7=7?

<?php
echo (int) ((0.1 + 0.7) * 10); //7

/*никогда не приводите неизвестную дробь к целому!
http://ru.php.net/manual/ru/language.types.integer.php
*/
?>
12 февраля 2009, 01:26