Скачка удаленного файла при помощи CURL

<?php
/**
 * Скачка удаленного файла при помощи CURL
 * автор: Nc_Soft
 * 27.04.08
 */

//открываем сеанс
$curl = curl_init('http://example.com/file.zip');

//задаем параметры
curl_setopt($curl, CURLOPT_USERAGENT, 'Boroda/2.0 J2ME/MIDP');

//открываем файловый дескриптор (куда сохранять файл)
$fp =fopen('save.zip','w+b');

//сохраняем файл
curl_setopt($curl, CURLOPT_FILE, $fp);

//запускаем сеанс
curl_exec($curl);

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

//закрываем дескриптор
fclose($fp);

?>
27 апреля 2008, 00:52

Создание Html документа при помощи DOM

<?php
/**
 * Создание Html документа при помощи DOM
 * автор: Nc_Soft
 * 25.04.08
 */

/*
правильный хтмл документ (well-formed) по сути является xml документов и
"конструктор" у нас в кармане, главное чтобы хостинг поддерживал DOM
*/

//создаем объект
$doc = new DOMDocument("1.0","UTF-8");

//добавим тэг html
$html = $doc->createElement("html");

//добавим тег body
$body = $doc->createElement("body");

//добавим тэг h1 и надпись
$h1 = $doc->createElement("h1","Тестовая надпись");

//сформируем html
$body->appendChild($h1);
$html->appendChild($body);
$doc->appendChild($html);

//вывод на экран
echo $doc->saveHTML();

/*
Пример создан для демонстрации возможности, сразу не понравилось то,
что русская надпись выглядит так
Тестовая
*/
?>
25 апреля 2008, 11:09

Выдача файла скриптом

<?php
/*
* Выдача файла скриптом
* автор: nc_soft
* 20.04.08
*/

//путь к файлу для выдачи
$file='./example.gif';

//Mime тип (в данном случаи image/gif)
$mime='image/gif';

//формируем заголовки

//MIME
header('Content-type:'.$mime);

//размер файла
header('Content-Length: '.filesize($file));

//указываем имя файла
header('Content-Disposition: attachment; filename='.basename($file));

/*
примечание: если так выдавать картинку, то мой сиеменс пытается сохранить ее
как имя_скрипта.gif, пробовал вот так
header('Content-Disposition: ; filename='.basename($file));
тоже самое.
С компа все в порядке.
Если кто знает как выдать для мобильника чтобы имя файла по умолчанию было какое указано
просьба отписаться.
*/

//вываливаем файл в браузер
readfile($file);

?>
20 апреля 2008, 13:09

Кэширование данных

<?php
/*
* Кэширование данных
* автор: Nc_Soft
* 15.04.08
*/

/*
Предположим, у нас есть некий скрипт, который собирает инфу с другого сайта,
(тоесть граббер страницы например http://example.com).
Пусть инфа на том гипотетическом сайте меняется например раз в час,
в данной ситуации довольно расточительно коннектиться к этому сайту при каждом запросе,
гораздо логичнее кэшировать данные, а чтобы они занимали меньше места, то и сжимать их.
И для этого совсем необязательно использовать класс Pclzip, вот предложу такой вариант:
*/

//урл
$url='http://example.com';

//путь к файлу-кэшу
$cache='./cache.gz';

//если нет файла-кэша или он устарел (1 час и более), то коннектимся
if (!file_exists($cache) || time() - filemtime($cache) > 3600 )
{
	//получение инфы
	$info=file_get_contents($url);

	//кэширование инфы с максимальным сжатием (level 9)
	$zp = gzopen($cache, 'w9');
	gzwrite($zp, $info);
	gzclose($zp);
}
else
{
	//берем $info из кэша, предварительно распаковав
	$info=gzfile($cache);
	$info=implode($info);
}

//выводим данные
echo $info;

/*
Таким образом, значительно сокращается число запросов к сайту-источнику, а если эта информация текстовая, 
то сжатие позволяет уменьшить ее объем до 10раз, тем самым хранение такого кэша не займет много места.
*/

?>
15 апреля 2008, 02:27

Кодирование сообщения по ключу

<?php
/*
* Кодирование сообщения по ключу
* автор: nc_soft
* 26.03.08
*/

$key="это ключ, если его не знать ничего не расшифровать";

$text="кодируемое сообщение";

//закодируем
$code=mcrypt_ecb(MCRYPT_DES,$key,$text,MCRYPT_ENCRYPT);

//сообщени закодировано, приняло вид бессмысленного набора байтов
echo "<p>сообщение закодировано: <b>$code</b></p>";

//раскодируем (надо применить ключ к этому набору байтов)
$decode=mcrypt_ecb(MCRYPT_DES,$key,$code,MCRYPT_DECRYPT);

echo "<p>сообщение раскодировано: <b>$decode</b></p>";

/*
что же делать, если на хостинге нет библиотеки для шифрования?
конечно же можно воспользоваться самопальными функциями их комментов сайта php.net или 
написать свою функцию :)
*/

function encrypt($string, $key) {
	$result = '';
	for($i=0; $i<strlen($string); $i++) {
		$char = substr($string, $i, 1);
		$keychar = substr($key, ($i % strlen($key))-1, 1);
		$char = chr(ord($char)+ord($keychar));
		$result.=$char;
	}

	return base64_encode($result);
}

function decrypt($string, $key) {
	$result = '';
	$string = base64_decode($string);

	for($i=0; $i<strlen($string); $i++) {
		$char = substr($string, $i, 1);
		$keychar = substr($key, ($i % strlen($key))-1, 1);
		$char = chr(ord($char)-ord($keychar));
		$result.=$char;
	}

	return $result;
}

//закодируем
$code=encrypt($text,$key);

//сообщени закодировано
echo "<p>сообщение закодировано: <b>$code</b></p>";

//раскодируем
$decode=decrypt($code,$key);

echo "<p>сообщение раскодировано: <b>$decode</b></p>";

?>
26 марта 2008, 17:27

Организация полнотекстового поиска в MYSQL

<?php
/*
* Организация полнотекстового поиска в MYSQL
* автор: Nc_soft
* 25.03.08
*/

//что ищем
$search='поисковая строка';

/*
Для организации поиска при небольшой нагрузки и коротких текстах отлично подходит оператор LIKE, пример
*/
$q=mysql_query("SELECT * FROM tablica WHERE pole LIKE '%$search%' ");

/*
Тут вроде бы все нормально, но когда количество записей и их объем сильно возрастет 
вы заметите, что поиск начинает занимать довольно много времени, и в итоге может достичь 
недопустимых пределов.
В таких случаях необходимо воспользоваться ИНДЕКСАМИ, например, сделаем через 
phpMyAdmin полнотекстовый индекс для ячейки pole, sql дамп создания таблицы приведен ниже

CREATE TABLE `tablica` (
  `id` int(11) NOT NULL auto_increment,
  `pole` TEXT,
  PRIMARY KEY  (`id`),
  FULLTEXT KEY `kluch` (`pole`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

обратите внимание на FULLTEXT KEY `kluch` (`pole`), индекс повешен на ячейку pole, 
как нетрудно заметить, размер базы данных из-за индекса увеличился примерно вдвое (за все надо платить).

Теперь искать по такой базе надо вот так:
*/

$q=mysql_query("SELECT * FROM tablica WHERE MATCH pole AGAINST ('$search') ");

/*
Скорость поиска возрастет минимум в 10раз, так же из плюсов то, что результаты будут отсортированы
по релевантности (тоесть сначала вся фраза, потом по частоте попадания слов)! (если не применять ORDER BY для иной сортировки конечно)

Также есть и минусы:
1. слова менее 4 символов не учитываются (как не имеющие "веса")
2. русские фразы находятся без учета морфологии
3. размер базы увеличивается из-за индекса
4. операции INSERT и UPDATE выполняются медленнее из-за индекса

если у вас в таблице более 10000 строчек и размер бд более 5мб наверное стоит перейти на полнотекстовый поиск
*/

?>
25 марта 2008, 18:42

ЗАПИСЬ В MYSQL данных из формы

<?php 
/* 
*ЗАПИСЬ В MYSQL данных из формы 
*автор: nc_soft 
*24.03.08 
*/ 

//переменная ошибок 
$error=array(); 

//обработчик формы 
if (!empty($_POST)) 
{ 
    //проверка параметра (удаляем лишние слэши и экранируем всё для записи в базу данных)
    $var=mysql_escape_string(stripslashes(trim($_POST['var'])));
	 
    if (empty($var)) 
    $error['empty']='не введен параметр'; 
     
    //если все нормально записываем
    if (empty($error)) 
    { 
		mysql_query("INSERT INTO tablica SET var='$var' ");
         
        /*переадресация , чтобы сбросить пост, это нужно чтобы при нажатии кнопки обновить  
         данные не добавились вновь*/ 
        header('Location: '.$_SERVER['SCRIPT_NAME'].'?ok=1'); 
        die(); 
    } 
} 

//если есть ошибки выводим 
if (!empty($error)) 
echo '<p>'.implode('<br />',$error).'</p>'; 

if (isset($_GET['ok'])) 
echo '<p>данные записаны</p>'; 

//сама форма 
?> 
<form action="<?=$_SERVER['SCRIPT_NAME'];?>" method="post"> 
<p> 
введите параметр:<br /> 
<input name="var" value="<?=isset($_POST['var']) ? htmlspecialchars(stripslashes(trim($_POST['var']))) : '';?>" /><br /> 
<input type="submit" value="отправить" /> 
</p> 
</form> 

<?php 
/* 
Примечания: 

Для сбора ошибок используется именно массив, потому что удобно впоследствии выводить их через <br /> или списком,  
в ключе ммассива также можно указать причину $error['empty']='не введен параметр'; 

параметр value у input записан так, чтобы при ошибочном вводе получить в форме то, что ввел юзер, раздражают формы,  
когда пишешь, пишешь, ошибаешься в одном поле и все приходится вводить заново. 

*/ 
?>
25 марта 2008, 01:24

Как инклудить при запуске cron'om

<?php
/*
* Как инклудить при запуске cron'om
* автор: Nc_soft
* 24.03.08
*/

/*
Во-первых опеределимся с командой для крона
/usr/local/bin/php -f /home/USER/domains/DOMEN/public_html/cript.php
(вместо USER и DOMEN пишем свои данные)
Далее может быть проблема, когда скрипт подключает другие файлы, способы типа
require_once('./file.php');
require_once($_SERVER['DOCUMENT_ROOT'].'/file.php');
могут не проканать, надо явно задавать путь
require_once("/home/USER/domains/DOMEN/public_html/file.php");
надеюсь это поможет вам съэкономить немного времени при попытки понять почему же не работает cron :)

ну и приведу пример отладочного скрипта
*/

//ошибки включаем
error_reporting(7);

//делаем буфер
ob_start('buff');

/*
далее идет скрипт
*/
echo 2+2;
echo 2+2;
echo 2+2;

//функция для сброса буфера
function buff($v)
{
    //можно отправить содержимое буфера себе на мыло или записать в файл
    mail('admin@site.ru','cron',$v);
}

/*
таким образом вы точно будете знать что выдает скрипт, когда запускается кроном
*/

?>
24 марта 2008, 22:05

Создание директории по ftp

<?php
/*
* Создание директории по ftp
* автор: nc_soft
* 17.03.08
*/

$user='test_login';
$pass='*******';
$host='ftp.site.ru';

//коннектимся
$ftp=ftp_connect($host) OR die("коннект невозможен");

//логинимся
if (!ftp_login($ftp,$user,$pass)) die('залогиниться неудалось');

//посмотрим файлы в корне ( / )
$flist=ftp_rawlist($ftp,'/');
print_r($flist);

/*изменим текущую директорию (проще говоря перейдем в каталог)
путь /domains/site.ru/public_html показан для примера и может отличаться от вашего хостига,
но обычно это самый распространенный вариант*/
ftp_chdir($ftp,'/domains/site.ru/public_html');

//посмотрим список в public_html
$flist=ftp_rawlist($ftp,'/domains/site.ru/public_html');
print_r($flist);

//создадим в /domains/site.ru/public_html папку с названием test
ftp_mkdir($ftp,'test');

//еще раз посмотрим список в public_html, там должна появиться папка test
$flist=ftp_rawlist($ftp,'/domains/site.ru/public_html');
print_r($flist);

//закрываем ftp соединение
ftp_quit($ftp);

?>
17 марта 2008, 16:28

изменение битрейта mp3

<?php
/*
* изменение битрейта mp3
* автор: Nc_soft
* 10.03.08
*/

/*
для этого нам потребуется поддержка Lame на хостинге и
разрешение выполнять команды ОС (функция exec )
а так в этом нет ничего сложного ;)
*/

//файл, который конвертим
$input_file='file_name.mp3';

//требуемый битрейт
$bit=64;

//куда сохранить выходной файл
$output_file='out.mp3';

//выполняем команду
exec("lame '".escapeshellcmd($input_file)."' -b $bit --mp3input '".escapeshellcmd($output_file)."' ");

/*
подробнее о LAME и на русском можно почитать тут:
http://www.allok.ru/?id=15
*/

?>
10 марта 2008, 23:21

Варианты выдачи страниц на php

<?php
/* 
* Варианты выдачи страниц на php
* автор: nc_soft
* 26.02.08
*/

//для начала заголовок
header('Content-type: application/vnd.wap.xhtml+xml;charset=utf-8');

//далее могут быть варианты

//вариант 1, всё через echo или принт
echo '<?xml version="1.0" encoding="UTF-8"?>';
echo '<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">';
echo '<html xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>
<body>
<p>Ваш ip: '.$_SERVER['REMOTE_ADDR'].'</p></body></html>';
/*вот такой вариант, на мой взгляд самый худший :)*/

//вариант 2, непосредственный вывод в браузер
//это обычно требуется через echo, потому что если включены short tags могут быть ошибки
echo '<?xml version="1.0" encoding="UTF-8"?>';
//далее закрываем php и выводим просто html код
?>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head></head>
<body>
<p>Ваш ip: <?=$_SERVER['REMOTE_ADDR'];?></p>
</body>
</html>
<?php

/*
очень хороший вариант, 
php код вкрапливается в html разметку, вроде бы идеальный способ,
но не годится для работы дизайнера, дизайнеру может быть сложно понять что к чему.
Для этого придумали ШАБЛОНЫ, вот пример простейшего:
Создаем файл шаблона, например index.tpl следующего содержания

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>
<body>
<p>Ваш ip: {{IP}}</p>
</body>
</html>

для дизайнера просто идеально, никакого php нет и в помине.
далее выводим шаблон
*/

echo strtr(file_get_contents('index.tpl'),array('{{IP}}'=>$_SERVER['REMOTE_ADDR']));

/*
как видите мы просто заменили в шаблоне {{IP}} на $_SERVER['REMOTE_ADDR'],
создается массив замены, а не строка, потому что замен может быть несколько.
Преимущества этого способа в том, что в шаблоне нет php кода, а в скрипте нет html
*/

?>
26 февраля 2008, 13:18

добавление кодировки по умолчанию

Чтобы добавить кодировку по умолчанию и
ваши страницы не были похожи на письмена неандертальцев 
необходимо в файле .htaccess прописать следующую строку (для утф-8):

AddDefaultCharset utf-8
21 февраля 2008, 20:24

Отправка письма по протоколу SMTP с авторизацией

<?php 
/*
* Отправка письма по протоколу SMTP с авторизацией
* автор: nc_soft
* 07.02.08
*/

//имя пользователя
$smtp_username = 'user@mail.ru'; 
//порт
$smtp_port = '25'; 
//smtp сервер
$smtp_host = 'smtp.mail.ru';
//пароль
$smtp_password = '**********'; 
//кодировка сообщений
$smtp_charset = 'utf-8';
//От кого
$smtp_from = 'от сайта snippets.pp.ru'; 
//тема
$subject = 'тема сообщения';
//куда шлем
$mail_to='user@mail.ru';


//открываем сокет
$socket=fsockopen($smtp_host, $smtp_port);
//так будем читать ответ после каждой посылки команды
echo fgets($socket);

//посылаем EHLO
fputs($socket, "EHLO $smtp_host\r\n");
echo fgets($socket);
echo fgets($socket);
echo fgets($socket);
echo fgets($socket);
echo fgets($socket);

//запрашиваем авторизацию
fputs($socket, "AUTH LOGIN\r\n");
echo fgets($socket);

//логин
fputs($socket, base64_encode($smtp_username) . "\r\n");
echo fgets($socket);

//пароль
fputs($socket, base64_encode($smtp_password) . "\r\n");
echo fgets($socket);

//от кого письмо
fputs($socket, "MAIL FROM: <$smtp_username>\r\n");
echo fgets($socket);

//получатель
fputs($socket, "RCPT TO: <$mail_to>\r\n");
echo fgets($socket);

//команда DATA говорит серверу что сейчас начнем передавать письмо
fputs($socket, "DATA\r\n");
echo fgets($socket);

//формируем письмо
$msg='';
//заголовок указывает куда отвечать на письмо
$msg .= "Reply-To: $smtp_username\r\n"; 
//версия mime
$msg .= "MIME-Version: 1.0\r\n";
//mime тип и кодировка 
$msg .= "Content-Type: text/plain; charset=\"$smtp_charset\"\r\n"; 
//следует указать 8бит для русских символов
$msg .= "Content-Transfer-Encoding: 8bit\r\n";
//поле от кого (можно вставить левые данные) 
$msg .= "From: \"$smtp_from\" <$smtp_username>\r\n";
//поле кому (тоже можно указать что угодно) 
$msg .= "To: $mail_to <$mail_to>\r\n"; 
//тема сообшения (закодирована в base64 чтобы нормально отображалась)
$msg .= "Subject: =?UTF-8?B?" . base64_encode($subject) . "?=\r\n";
//приоритет
$msg .= "X-Priority: 3\r\n\r\n"; 

//сообщение
$msg .= "это тестовое сообщение\r\n";

//отправляем письмо (обратите внимание на \r\n.\r\n
fputs($socket, $msg."\r\n.\r\n");
echo fgets($socket);

/*письмо отправлено, лог ответов сервера выглядит так
220 mail.ru ESMTP Thu, 07 Feb 2008 03:32:20 +0300
250-mx34.mail.ru Hello smtp.mail.ru [217.8.236.128]
250-SIZE 31457280
250-8BITMIME
250-AUTH PLAIN LOGIN
250 PIPELINING
334 VXNlcm5hbWU6
334 UGFzc3dvcmQ6
235 Authentication succeeded
250 OK
250 Accepted
354 Enter message, ending with "." on a line by itself
250 OK id=1JMuge-0006sO-00
*/

?>
7 февраля 2008, 04:43

Удаление директории

<?php
/*
* Удаление папки
* автор: nc_soft
* 01.02.08
*/

/*
для удаленея папки надо предварительно удалить все ее содержимое,
воспользуемся рекурсивной функцией
*/

function DelDir($dir) 
{
    //если не открыть директорию
	if (!$dd = opendir($dir)) return false;
	
	//читаем директорию в цикле
    while (false !== ($obj = readdir($dd)))
	{
        //пропускаем системные каталоги
		if($obj=='.' || $obj=='..') continue;
		
		//пробуем удалить объект, если это не удается, то применяем функцию к этому объекту вновь
        if (!@unlink($dir.'/'.$obj)) DelDir($dir.'/'.$obj);
    }

    closedir($dd);
	
		//удаляем пустую директорию
        @rmdir($dir);
}

//пример удаления директории pictures
DelDir('pictures');

/*
 создано по материалам комментариев на 
 http://ru2.php.net/unlink
*/
?>
1 февраля 2008, 19:28

Basic авторизация через socket

<?php
/*
*Basic авторизация через socket
*автор: nc_soft
*30.01.08
*/

/* кто не знает что это такое перейдите по ссылке http://snippets.pp.ru/basic/index.php */

//сайт
$host='snippets.pp.ru';

//скрипт-обработчик
$path='/basic/index.php';

//юзер и пароль 
$user = "nc_soft"; 
$password = "snippets";

//открываем сокет
$fp = @fsockopen("tcp://".$host, 80, $errno, $errstr, 10);
if (!$fp)
{
	die($errstr.':'.$errno);
}
else
{
	$out  = "GET $path HTTP/1.0\r\n";
	$out .= "Host: $host\r\n";

	//авторизируемся
	$out .= "Authorization: Basic " . base64_encode("$user:$password") . "\r\n";

	$out .= "Connection: Close\r\n\r\n";

	//посылаем данные
	fwrite($fp, $out.$data);

	$headers='';

	//читаем заголовки
	while ($str = trim(fgets($fp, 4096)))
	$headers .= "$str\n";

	$body='';

	//читаем ответ
	while (!feof($fp))
	$body.= fgets($fp, 4096);

	//закрываем сокет
	fclose($fp);
}

//выводим данные
echo $headers.'<hr/>'.$body;

?>
30 января 2008, 20:43

Запись новостей в RSS канал

<?php
/*
* Запись новостей в RSS канал
* автор: nc_soft
* 19.01.08
*/

//для начала сформируем RSS если он еще не создан (для папки rss необходиы права на запись)
$file='./rss/rss.xml';

if (!file_exists($file))
{
	$rss='<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
	<channel>
		<title>НАЗВАНИЕ КАНАЛА</title>
		<link>http://site.ru/rss/rss.xml</link>
		<description>описание канала</description>
		<language>ru</language>
    </channel>
</rss>';
	fwrite(fopen($file,'w+'),$rss);
}

//далее идет пример как добавить одну новость 

//грузим файл
$xml=simplexml_load_file($file);

//довавляем новый элемент item
$item=$xml->channel->addChild('item');

//пишем атрибуты новости
$item->link='http://site.ru/about_news.php';
$item->title='заголовок';
$item->author='автор';

//дата публикации
$item->pubDate=date('d.m.y H:i:s');

$item->description='описание самой новости';

//сохраняем как xml файл
$xml->asXML($file);

/*при записи новости не надо заботиться об htmlspecialchars()
файл rss.xml можно спокойно читать rss клиентом.
*/

?>
19 января 2008, 14:35

Снятие скриншота с 3gp видеоролика

<?php
/*
* Снятие скриншота с 3gp видеоролика
* автор: nc_soft
* 17.01.08
*/

if (!class_exists(ffmpeg_movie))
{
	die('ничего не выйдет, нужна ffmpeg на хостинге');
}

//создание объекта (тестовый файл test.3gp)
$file='test.3gp';

if (file_exists($file))
{
	$mov = new ffmpeg_movie($file);
}
else
{
	die('невозможно найти файл');
}

//номер кадра
$frame = 50;

//ширина
$w = $mov->GetFrameWidth();

//высота
$h = $mov->GetFrameHeight();

//извлечение кадра
$ff_frame = $mov->getFrame($frame);

if ($ff_frame)
{
	//в формат GD
	$gd_image = $ff_frame->toGDImage();

	if ($gd_image)
	{
		//вывод (для примера в gif)
		header('Content-type: image/gif');
		imagegif($gd_image);

		/*можно сделать изменение размера, нанесение копирайтов и водяных знаков, в общем все что применимо для GD*/
	}
	else
	{
		die('невозможно преобразовать в GD');
	}
}
else
{
	die('невозможно извлечь кадр');
}

/*
описания всех методов ffmpeg_movie смотрим тут
http://ffmpeg-php.sourceforge.net/doc/api/ffmpeg_movie.php
*/
?>
17 января 2008, 12:17

проверка строки в utf-8

<?php
/*
* проверка строки в utf-8
* автор: W3C
* 09.01.08
*/

function is_utf8($string)
{
    return preg_match('%^(?:
          [\x09\x0A\x0D\x20-\x7E]            # ASCII
        | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
        |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
        | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
        |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
        |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
        | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
        |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
    )*$%xs', $string);

}

//как не трудно догадаться возвращает 0 или 1, пример:
$text='Cъешь еще этих мягких французских булок, да выпей чаю';
if (is_utf8($text))
{
    echo 'строка1 в утф-8 ';
}
else 
{
    echo 'строка1 содержит плохие символы ';
}

//пример некорректной строки, просто передадим картинку в текст
$text=file_get_contents('http://www.w3.org/Icons/w3c_home.gif');
if (is_utf8($text))
{
    echo 'строка2 в утф-8 ';
}
else 
{
    echo 'строка2 содержит плохие символы ';
}

// http://www.w3.org/International/questions/qa-forms-utf-8.en.php
?>
9 января 2008, 13:48

Крутилка рекламы

<?php
/*
* Крутилка рекламы
* автор: nc_soft
* 07.01.08
*/

//задаем рекламу в массиве
$rekla=array(
'ссылка_1' => 'http://url_l.com',
'ссылка_2' => 'http://url_2.com',
'ссылка_3' => 'http://url_3.com'
);

$index=array_rand($rekla);

echo '<a href="'.$rekla[$index].'">'.$index.'</a>';
?>
7 января 2008, 22:33

Basic авторизация через CURL

<?php
/*
* Basic авторизация через CURL
* автор: nc_soft
* 01.01.08
*/

/* кто не знает что это такое перейдите по ссылке http://snippets.pp.ru/basic/index.php */

//запрашиваемая страница
$curl = curl_init('http://snippets.pp.ru/basic/index.php');
 
//юзер и пароль
$user = "nc_soft";
$password = "snippets";

//это потом раскомментируете, чтобы убедиться в необходимости этих данных ;)
//$user=$password='';
          
 
//вразумительный браузер
curl_setopt($curl,CURLOPT_USERAGENT,"Mozilla/4.0");

//интересно посмотреть заголовки?
curl_setopt($curl,CURLOPT_HEADER,1);

 
//если есть юзер и пароль, то вводим
if(!empty($user) && !empty($password))
{
    //говорим что это basic, хотя и без этого работает с моей страницей
    curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
    
    curl_setopt($curl,CURLOPT_USERPWD,$user . ":" . $password);
}
 
 
//посылаем запрос
curl_exec($curl);

?>
1 января 2008, 21:36