Показаны сообщения с ярлыком php. Показать все сообщения
Показаны сообщения с ярлыком php. Показать все сообщения

четверг, 23 февраля 2017 г.

Перевод даты с английского на русский PHP


Перевод даты с английского на русский PHP


function rus_date() {
// Перевод
 $translate = array(
 "am" => "дп",
 "pm" => "пп",
 "AM" => "ДП",
 "PM" => "ПП",
 "Monday" => "Понедельник",
 "Mon" => "Пн",
 "Tuesday" => "Вторник",
 "Tue" => "Вт",
 "Wednesday" => "Среда",
 "Wed" => "Ср",
 "Thursday" => "Четверг",
 "Thu" => "Чт",
 "Friday" => "Пятница",
 "Fri" => "Пт",
 "Saturday" => "Суббота",
 "Sat" => "Сб",
 "Sunday" => "Воскресенье",
 "Sun" => "Вс",
 "January" => "Января",
 "Jan" => "Янв",
 "February" => "Февраля",
 "Feb" => "Фев",
 "March" => "Марта",
 "Mar" => "Мар",
 "April" => "Апреля",
 "Apr" => "Апр",
 "May" => "Мая",
 "May" => "Мая",
 "June" => "Июня",
 "Jun" => "Июн",
 "July" => "Июля",
 "Jul" => "Июл",
 "August" => "Августа",
 "Aug" => "Авг",
 "September" => "Сентября",
 "Sep" => "Сен",
 "October" => "Октября",
 "Oct" => "Окт",
 "November" => "Ноября",
 "Nov" => "Ноя",
 "December" => "Декабря",
 "Dec" => "Дек",
 "st" => "ое",
 "nd" => "ое",
 "rd" => "е",
 "th" => "ое"
 );
 // если передали дату, то переводим ее
 if (func_num_args() > 1) {
 $timestamp = func_get_arg(1);
 return strtr(date(func_get_arg(0), $timestamp), $translate);
 } else {
// иначе текущую дату
 return strtr(date(func_get_arg(0)), $translate);
 }
 } 



PHP define IP address

Определение IP адреса на PHP можно сделать функцией, которая вернет строковое значение:


function getip()
{
  if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"),"unknown"))
    $ip = getenv("HTTP_CLIENT_IP");
  elseif (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
    $ip = getenv("HTTP_X_FORWARDED_FOR");
  elseif (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
    $ip = getenv("REMOTE_ADDR");
  elseif (!empty($_SERVER['REMOTE_ADDR']) && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
    $ip = $_SERVER['REMOTE_ADDR'];

  else
    $ip = "unknown";
  return($ip); //ip посетителя
}


PHP Recursive data from query


Необходимо сделать рекурсивный вывод данных из массива используя один запрос к базе.
Пример для вывода записей в выпадающий список:
function build_tree($arrs, $parent_id=0, $level=0) {
    foreach ($arrs as $arr) {
        if ($arr['ParentID'] == $parent_id) {
            echo '<option value="' . $arr['ID'] . '">'.str_repeat(" &nbsp", $level)." ".$arr['Title'].'</option>';
            build_tree($arrs, $arr['ID'], $level+1);
        }
    }
}
echo '<select onchange="location = this.value;">';
build_tree($arr_b, 0);
echo '</select>';

а еще можно вывести ссылки таким способом:
// Recursive function
function getList($rows, $id=0){
    // Start a new list
    $newList = null;
    foreach($rows as $key => $row) {
        if ($row['ParentID'] == $id) {
            // Add an UL tag when LI exists
            $newList == null ? $newList = "<ul>" : $newList;
            $newList .= "<li>";
            $newList .= "<a href=\"\">{$row['Title']}</a>";
            // Find childrens
            $newList .= getList(array_slice($rows,$key),$row['ID']);
            $newList .= "</li>";
        }
    }
    // Add an UL end tag
    strlen($newList) > 0 ? $newList .= "</select>" : $newList;
    return $newList;
}
 print_r(getList($arr_b));

воскресенье, 30 ноября 2014 г.

Парсинг Я-новостей на PHP


 Парсинг Я-новостей 


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
        <title>Парсинг Я.Новости</title>
        <meta http-equiv="content-type" content="text/html;charset=utf-8" />
</head>
<body>

<?php

function curlFunc($url){
 $ch = curl_init();
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$result = curl_exec($ch);
 curl_close($ch);
return $result;

}



function getYandexNews($q){
            $q = str_replace(" ","+",$q);
$h = curlFunc('http://news.yandex.ru/yandsearch?text='.$q.'&rpt=nnews2');

preg_match_all('/<a onclick="(.*?)" href="(.*?)"(.*?)class="title">(.*?)<\/a>(.*?)<span class="info">(.*?)<p>(.*?)<\/p>/is', $h, $matches);

$SStr = '';
for($i=1;$i<sizeof($matches[1]);$i++){

   if(!empty($matches[2][$i])){

         $SStr .= '<li><a href="'.trim(strip_tags($matches[2][$i])).'" target="_blank">'.trim(strip_tags($matches[4][$i])).'</a><br />

         '.$matches[7][$i].'

         <small>'.$lm.'</small>

         </li>';

         }

}

return  $SStr;

}

echo getYandexNews('Zapros');
?>

</body>
</html>

пятница, 14 ноября 2014 г.

Парсим текст и сохраняем через FTP-соединение на PHP


Парсим текст и сохраняем через FTP-соединение на PHP

 

 /* получаем содержимое нужной нам страницы в переменную $content (обратите внимание, – мы используем для этого функцию file_get_contents. Она может работать с удаленными URL только если в настройках PHP установлена опция allow_url_fopen) */
$content = file_get_contents('http://news.yandex.ru/');
// Определяем позицию строки, до которой нужно все отрезать (используем функцию strpos()).
$pos = strpos($content, '<h2>Главные новости</h2>');
/*Отрезаем все, что идет до нужной нам позиции (функция substr в данном случае принимает два параметра: строка для обработки и //номер позиции. Функция вернет строку, НАЧИНАЯ с указанной позиции) */
$content = substr($content, $pos);
// Точно таким же образом находим позицию второй строки
$pos = strpos($content, '<hr>');
// Отрезаем нужное количество символов от нулевого
$content = substr($content, 0, $pos);
// не выводим полученную строку.
// echo $content;

// Отрезаем нужное количество символов от нулевого
$content = substr($content, 0, $pos);
// преобразовываем ссылку
$content = str_replace("href=\"/society/", "href=\"http://novostey.com/society/", $content);
// преобразовываем изображение
$content = str_replace("src=\"/thumbs/", "src=\"http://novostey.com/thumbs/", $content);
// создаем файл index.html
$fps = fopen("index.html","w+");
// записываем в index.html обработанную информацию
fwrite($fps,$content);
// закрываем файл index.html
fclose($fps);
// подключаемся к FTP
// переменные для логина
$ftphost = "ftp.narod.ru";
$user = "phpelse";
$password = "phpelse7";
// открываем FTP соединение, в случае неудачи останавливаем работу сценария
$fp = ftp_connect($ftphost) or die ("Не могу соединиться c FTP сервером");
// логинимся
$connect = ftp_login($fp, $user, $password);
// проверяем успешность входа
if($connect) echo "OK – мы вошли как $user ";
else
echo "Ошибка входа на FTP сервер";
ftp_pasv($fp, TRUE);
$indexfile = fopen("index.html", "r"); // открываем нужный файл для чтения
$loadfile = ftp_fput($fp, "index.html", $indexfile, FTP_ASCII); // передаем его на FTP
fclose($indexfile); // закрываем файл
// закрываем FTP соединение
ftp_close($fp);

суббота, 28 июня 2014 г.

Навигатор страниц на сайта PHP

Навигатор страниц на PHP | navigaror of pages na php


<link rel="stylesheet" href="style.css" type="text/css" media="screen" /><!--Подключение стилей-->
<?php
require_once("class.navigator.php"); // подключение класса для постраничной навигации
$Page=1; //номер страницы которую нужно открыть
if($_GET["page"]) $Page=$_GET["page"]; //если был произведен запрос другой страницы, то присваиваем переменной новый индекс
$array=array(
array( //настройки для подключения к БД
'host'=>"localhost", // хост
'user'=>"root", // пользователь
'password'=>"", //пароль
'name_bd'=>"test", //база данных
),
array( 'countRecordOnPage'=>5,//количество выводимых записей
'numberPage'=>$Page,//номер запрашиваемой страницы
'paramName'=>"page",//название параметры в GET запросе
'linkCount'=>5, //количество страниц в списе
'viewAll'=>false //показать все записи на одной странице )
); $navigator = new Navigator($array, "SELECT * FROM models"); //определяем класс
echo $navigator->getNavigator();//выводим запрашиваемую страницу
?>


Сам класс навигатора

<?php
class Navigator{
//Блок переменных достуных только внутри класса .
private $SQL_SETTING; // Параметры подключения к БД.
private $CONNECT; //Указатель на соединение с MySQL.
private $COUNTRECORD; //Количество выводимых записей на странице.
private $SQL; // Исходный SQL запрос.
private $NUMBERPAGE; //Номер текущей страницы.
private $VIEWALL; //Флаг - показать все страницы.
private $PARAMNAME; //Имя параметра в GET запросе например "page".
private $LINKCOUNT; //количество выводимых ссылок на страницы в пайджере.
private $NAVIGATOR; //сформировананный навигатор, готовый к выводу.
// конструктор класса
public function  __construct($arr,$sql){
foreach($arr[0] as $attr=>$val){ //Проверяем всели необходимые параметры подключения к БД переданы.
if(strlen(trim($val))==0 && $attr!='password') return false;// если один из параметров не передан, завершаем работу.
}
//инициализируем переменные класса
$this->SQL_SETTING=$arr[0];//Записываем в переменную класса настройки для подключения.
$this->SQL=$sql;//Записываем в переменную исходный запрос.
$this->COUNTRECORD=$arr[1]['countRecordOnPage'];//Записываем в переменную класса количество выводимых записей на странице
$this->NUMBERPAGE=$arr[1]['numberPage'];//Записываем в переменную класса номер текущей страницы.
   $this->VIEWALL=$arr[1]['viewAll'];//Записываем в переменную флаг "Показать все".
$this->PARAMNAME=$arr[1]['paramName'];
$this->LINKCOUNT=$arr[1]['linkCount'];
//инициализируем соединение с БД
if($this->initConectionBD()){ //если соединение успешно установленно
if(!$this->VIEWALL) $this->calcDataPage();// если нет влага "Показать все", вычисляем позицию нужной страницы
$this->NAVIGATOR=$this->getPage();
mysql_close($this->CONNECT);
}
else return false;
return true;
}
public function getNavigator(){
return $this->NAVIGATOR;
}
private function initConectionBD(){
// если удаоль подключиться к БД
if($this->CONNECT=@mysql_connect($this->SQL_SETTING['host'],$this->SQL_SETTING['user'],$this->SQL_SETTING['password']))
{
//выбираем таблицу для дальнейшей работы
if(mysql_select_db($this->SQL_SETTING['name_bd'], $this->CONNECT) or die(mysql_error())) return true;
}
else{
echo "Ошибка подключения к БД!";
}
return false; //если что - то пошло не так , возвращаем false
}
private function calcDataPage(){
$result = mysql_query($this->SQL) or die (mysql_error());// выполняем исходный запрос к БД
$count=mysql_numrows($result); //узнаем количество возвращенных записей
$maxCountRecOnPage=ceil($count/$this->COUNTRECORD);//Вычисляем максимально доступное количество страниц
$this->maxCountRecOnPage=$maxCountRecOnPage;
if($maxCountRecOnPage<=($this->NUMBERPAGE-1)){ // если максимальное количество страниц меньше чем номер запрашиваемой $pos=$maxCountRecOnPage-1;
$pos=$maxCountRecOnPage-1; // то запросим у MySql последнюю доступную страницу
} elseif(0>=($this->NUMBERPAGE-1)){ //если номер запрашиваемой страницы, меньше либо равен 0
$pos=0; //то запросим у MySql первую доступную страницу
} else{ // если запрашиваемая страница попадает в диапазон существующих
$pos=$this->NUMBERPAGE-1; //то запросим у MySql нужную страницу
} // к запросу дописываем параметр вывода записей с нужной позиции, и их количесвто
$this->SQL=$this->SQL." LIMIT ".$pos*$this->COUNTRECORD.", ".$this->COUNTRECORD;
echo $this->SQL;
}
//получаем страницу, и выводим ее
private function getPage(){
$result = mysql_query($this->SQL) or die (mysql_error());// выполняем запрос к БД $table = "<table border='1'>"; // начинаем формировать таблицу, для вывода полученных данных
if($row = mysql_fetch_assoc($result)){// получаем первую строку данных $table .= "<tr>"; foreach(array_keys($row)as $theader){ // для каждого поля создаем заголовок в таблице
$table .= "<th>".$theader."</th>";
} $table .= "</tr>"; $table .= "<tr>"; foreach($row as $data){//также добавляем полученную строку данных в соответствующие поля таблицы
$table .= "<td>".$data."</td>";
}
$table .= "</tr>"; }
while ($row = mysql_fetch_assoc($result)){//все оставшиеся строки, добавляем в таблицу
$odd++%2==0? $odd_class="odd":$odd_class="";
$table .= "<tr class='".$odd_class."'>"; foreach($row as $data){
$table .= "<td>".$data."</td>";
} $table .= "</tr>";
} $table .= "</table> "; $page .= $table;
if(!$this->VIEWALL) $page .= $this->createNavigator();
return $page;
}
private function createNavigator(){
//формирование  навигатора //если текущая страница, выходит за рамки допустимых, то показываем первую доступную с нужной стороны.
if($this->NUMBERPAGE<=0)$this->NUMBERPAGE=1; // если текущая страница меньше первой то показываем всегда перву.
if($this->NUMBERPAGE>$this->maxCountRecOnPage)$this->NUMBERPAGE=$this->maxCountRecOnPage;// если текущая страница больше последней то показываем всегда последнюю.
//создаем кнопки для навигатора
if($this->NUMBERPAGE>1){ // если не первая страница
$prev="<a class='nav_button' href='?".$this->PARAMNAME."=".($this->NUMBERPAGE-1)."'><</a>";// создаем сслыку на предыдущую
$first="<a class='nav_button' href='?".$this->PARAMNAME."=1'><<</a>"; // создаем сслыку на первую
}
if($this->NUMBERPAGE<$this->maxCountRecOnPage){ // если не последняя страница
$next="<a class='nav_button' href='?".$this->PARAMNAME."=".($this->NUMBERPAGE+1)."'>></a>";// создаем сслыку на следующую
$last="<a class='nav_button' href='?".$this->PARAMNAME."=".$this->maxCountRecOnPage."'>>></a>";// создаем сслыку на последнюю
}
//средняя часть навигатора , вывод ссылок по половине от общего числа выводимых, по обе стороны текущей страницы
for($i=($this->NUMBERPAGE-floor($this->LINKCOUNT/2)); $i<=($this->NUMBERPAGE+floor($this->LINKCOUNT/2)); $i++){
$class="linkPage"; //всем ссылкам назначается класс
if($i==$this->NUMBERPAGE)$class="activ"; //если ссылка идет на текущую то ей присваивается особый класс
if($i<=0){ // формирование ссылок на добавочные с конца страницы $lastpages="<a class='".$class."' href='?".$this->PARAMNAME."=".(abs($i)+$this->NUMBERPAGE+floor($this->LINKCOUNT/2)+1)."'>".(abs($i)+$this->NUMBERPAGE+floor($this->LINKCOUNT/2)+1)."</a>".$lastpages;
$leftpoint=""; //если начали добавлять  страницы, убираем точки с другого конца
$noleftpoint=true;// флаг о том что точки слева убраны }
if($i>$this->maxCountRecOnPage){ // формирование ссылок на добавочные с начала страницы
$firstpages="<a class='".$class."' href='?".$this->PARAMNAME."=".abs($i-$this->maxCountRecOnPage-$this->NUMBERPAGE+floor($this->LINKCOUNT/2))."'>".abs($i-$this->maxCountRecOnPage-$this->NUMBERPAGE+floor($this->LINKCOUNT/2))."</a>".$firstpages;
$norightpoint=true;//если начали добавлять  страницы, убираем точки с другого конца
$rightpoint="";// флаг о том что точки справа убраны
}
if($i>0 && $i<=$this->maxCountRecOnPage){ //если формируемая ссылка попадает в интервал допустимых страниц
if(!$noleftpoint)$leftpoint="<span class='point'>...</span>"; //добавляем точки слева от списка
$pager.="<a class='".$class."' href='?".$this->PARAMNAME."=".$i."'>".$i."</a>";//создаем ссылку
if(!$norightpoint)$rightpoint="<span class='point'>...</span>"; //добавляем точки справа от списка
}
}
//склеиваем все сгенерированные части навигатора
$navigator=$first.$prev.$leftpoint.$firstpages.$pager.$lastpages.$rightpoint.$next.$last;
// возвращаем полученный список страниц
return $navigator;
}
}


пятница, 16 мая 2014 г.

Формирование RSS ленты на PHP

Формирование RSS ленты на PHP

header("Content-Type: text/xml");
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
 
echo '<rss version="2.0">
<channel>';

$start=0;
$limit=50; 

 $data = '<title>'.SITE_NAME.'</title>';
 $data.= '<link>'.URL.'</link>';
 $data.= '<description>'.DESCRIPTION.'</description>';
 $data.= '<language>ru</language> ';
 
$request = ("SELECT * FROM `wp_posts` WHERE  `post_status`='publish' AND `post_type` = 'post' ORDER BY ID DESC LIMIT $start, $limit"); 
$array=$db->getarr($request);

 
if ($array) {
 foreach($array as $id=>$myrow) {
 $data.= '<item>';
 $data.= '<title>'.$myrow["post_title"].'</title>';
 $data.= '<link>post/'.$myrow["guid"].'.html</link>';
 $data.= '<description>'.strip_tags(htmlspecialchars($myrow["post_excerpt"])).'</description>';
 $data.= '<author>'.EMAIL.'</author>';
 $data.= '<guid>post/'.$myrow["guid"].'.html</guid>';
 $data.= '</item>';
 } 
} 

echo $data.'</channel> 
</rss>';

// В шапку добавить: <link rel="alternate" type="application/rss+xml" title="FEED" href="http://www.site.info/feed.php" />



Создание карты сайта XML на PHP

Создание карты сайта XML на PHP



echo "processing...";
$control_file='sitemap1.xml';
if (!file_exists($control_file))  { fopen($control_file, 'w'); };
$file=fopen($control_file,"w");
$datetime =  Date('Y-m-d\TH:i:sP');
$data='<?xml version="1.0" encoding="UTF-8"?>
<urlset
      xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
            http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
<url>
  <loc>http://example.com/</loc>
  <lastmod>'.$datetime.'</lastmod>
  <changefreq>monthly</changefreq>
  <priority>1.00</priority>
</url>';


$lim=0;
$to=40000;
$request = ("SELECT `id`, `title`, `link` FROM `tblname` WHERE visible='1' LIMIT $lim,$to"); 
$array=$db->getarray($request); // получение массива из базы
$output="";
if ($array) {
 foreach($array as $id=>$myrow) {
  $data.= p"\n<url><loc>http://example.com/post/".$myrow["id"]."</loc>\n <changefreq>weekly</changefreq>  <priority>0.64</priority>\n\n </url>";
 }
}
$data.= "\n </urlset>";
fwrite($file,"".$data);
// Закрыть файл 
fclose($file); 
echo "Sitemap Songs is ready.";

воскресенье, 30 марта 2014 г.

Парсер на PHP с cURL - аналог функции file_get_contents()


Парсер на PHP с cURL - аналог функции file_get_contents()


// Инициализируем курл
$ch = curl_init('адрес страницы донора');

// Параметры курла
curl_setopt($ch, CURLOPT_USERAGENT, 'IE20');
curl_setopt($ch, CURLOPT_HEADER, 0);
// Следующая опция необходима для того, чтобы функция curl_exec() возвращала значение а не выводила содержимое переменной на экран
curl_setopt($ch, CURLOPT_RETURNTRANSFER, '1');

// Получаем html
$text = curl_exec($ch);

// Отключаемся
curl_close($ch);

// Находим и сохраняем нужный фрагмент
preg_match( '/(.*?)/is' , $text , $links );

// Выводим результат на экран
echo $links[0];

вторник, 10 декабря 2013 г.

Regular Expressions

Регулярные выражения


Словосочетание «регулярные выражения», прямой перевод английского «Regular expressions», звучит довольно неуклюже.
Однако оно уже настолько прижилось, что попало в словари, поэтому придется использовать именно его – за неимением лучшего.

Регулярные выражения – это один из способов поиска подстрок (соответствий) в строках. Осуществляется это с помощью просмотра строки в поисках некоторого шаблона.
Общеизвестным примером могут быть символы «*» и «?», используемые в командной строке DOS.

Синтаксис регулярных выражений, использующийся в NovA FileRenamer, соответствует полному POSIX стандарту, а также поддерживает расширенный синтаксис языка Perl.

Шаблон поиска (регулярное выражение) - это простая строка и любые символы в этой строке, которые не являются специальными (зарезервированными), считаются обычными символами.
Каждый символ регулярного выражения последовательно сравнивается с проверяемой строкой (в случае FileRenamer'а - имя файла).
Все, что не является указанными ниже спецсимволами или операторами, воспринимается, как обычный символ, рассматриваемый на простое совпадение.



Спецсимволы 

Символы ".", "|", "*", "?", "+", "(", ")", "{", "}", "[", "]", "^", "$" и "\" являются зарезервированными. Но если перед таким символом поставить "\", он становится обычным.



Универсальный символ (wildcard)

Точка "." заменяет собой любой символ, в том числе пустой.



Квантификаторы, они же умножители (Quantifiers) 

Если неизвестно, сколько именно знаков должна содержать искомая подстрока, можно использовать спецсимволы, так называемые, умножители.
Например, можно написать "hel+o", что будет означать слово, начинающееся с "He", со следующими за ним одно или несколько "l", и заканчивающееся на "о".

Вот список поддерживаемых квантификаторов:
Символ   Описание
  *      Соответствует 0 или более вхождений предшествующего выражения.
         Например, "zo*" соответствует "z" и "zoo".
  +      Соответствует 1 или более предшествующих выражений.
         Например, "zo+" соответствует "zo" и "zoo", но не "z".
  ?      Соответствует 0 или 1 предшествующих выражений.
         Например, "do(es)?" соответствует "do" в "do" или "does".
 {n}     n – неотрицательное целое. Соответствует точному количеству вхождений.
         Например, "o{2}" не найдет "o" в "Bob",но найдет два "o"" в "food".
 {n,}    n – неотрицательное целое. Соответствует вхождению, повторенному не менее n раз.
         Например, "o{2,}" не находит "o" в "Bob", зато находит все "o" в "foooood".
         "o{1,}" эквивалентно "o+". "o{0,}" эквивалентно "o*".
{n,m}    m и n – неотрицательные целые числа, где n <= m. Соответствует минимум n и
         максимум m вхождений. Например, "o{1,3}" находит три первые "o" в "fooooood".
         "o{0,1}" эквивалентно "o?". Пробел между запятой и цифрами недопустим.

Квантификаторы относятся к наиболее короткому предшествующему выражению: например, одиночный символ, набор символов или подвыражение в скобках.


Жадность

Важной особенностью квантификаторов "*" и "+" является их всеядность. Они находят все, что смогут – вместо того, что нужно.
Например, регулярное выражение "h.*o" в строке "hello out there, how are you" найдёт "hello out there, how are yo", хотя в виду, наверное, имелось "hello".
Так происходит из-за жадности регулярного выражения, ищущего не первую, а последнюю "о". Излечить квантификатор от жадности можно, добавив "?".
То есть, "h.*?o" найдёт найдет именно "hello", что и было нужно, поскольку ищет "h", за которым следует несколько произвольных символов, до первого встреченного "o".



Группировка 

Круглые скобки "(" и ")" служат двум целям - для группирования символов в подвыражения и запоминания того, что этим выражениям соответствует.
Запомненные соответствия в дальнейшем могут использоваться в строке замены, в которой \N обозначает N'ую часть соответствия.
Например, шаблон "(ab)*" найдёт всю строку "ababab", а вместо \1 будет подставлено "ab". Подвыражения нумеруются слева направо с 1 до 9, подвыражение 0 является всем шаблоном.

Если нужно сгруппировать символы, но запоминать это подвыражение не надо (например, чтобы не разбить другое подвыражение верхнего уровня), то следует использовать конструкцию (?:выражение).
Например, шаблон "(?:abc)*" не создаёт подвыражений.



Lookahead-условия

Иногда нужно сказать "найдите вот это, но только если за ним (не)стоит вот этого". Для этого используются так называемые lookahead-условия двух типов:

Положительное lookahead-условие "re1(?=re2)"
   Соответствует регулярному выражению re1, только если за ним следует выражение re2.
Отрицательное lookahead-условие "re1(?!re2)"
   Соответствует регулярному выражению re1, только если за ним не следует выражение re2.
Например, шаблон "abc(?=def)" в строке "abcdef" найдёт "abc", а в строке "abcghi" нет.


Вариации 

Символ "|" можно использовать для перебора нескольких вариантов - выражение re1|re2|re3 будет соответствовать регулярному выражению re1 или re2 или re3.
Каждый вариант - наиболее длинное предшедствующее подвыражение (поведение противоположное квантификаторам).

Примеры:
"a(b|c)" совпадёт с "ab" или "ac"
"abc|def" совпадёт с "abc" или "def".



Наборы символов (Sets) 

Используя квадратные скобки "[" и "]", можно указать группу символов (набор) для поиска.
Набор может содержать обычные символы, диапазоны символов, классы символов и классы похожих символов (equivalence classes).
С помощью конструкции "[^список]" можно указать символы, которых не должно содержаться в найденной подстроке.

Примеры:
Наборы обычных символов:
"[abc]" совпадёт с "a", "b" или "c"
"[^abc]" совпадёт с любым символом кроме "a", "b" или "c"

Диапазоны символов:
"[a-z]" совпадёт с любым символом из диапазона от "a" до "z"
"[^A-Z]" совпадёт с символом, который не лежит в диапазоне от "A" до "Z"

Классы символов указываются в наборе с помощью конструкции "[:имя_класса:]". Например, "[[:space:]]" находит любые символы пробела. В FileRenamer'е доступны следующие классы символов:
alnum    алфавитно-цифровой символ (буква, цифра)
alpha    любая буква
digit    цифра 0-9
lower    строчная (маленькая) буква
punct    символ пунктуации
space    любой символ пробела
upper    заглавная (большая) буква
xdigit   шестнадцатиричная цифра - 0-9, a-f и A-F
word     любой встречающийся в слове символ - алфавитно-цифровой и символ подчёркивания

Вместо полного названия класса символов можно использовать сокращения:
\w вместо [:word:]
\s вместо [:space:]
\d вместо [:digit:]
\l вместо [:lower:]
\u вместо [:upper:]

Для того чтобы включить символ "-" (дефис) в набор символов, поставьте его либо первым (после "[" или "[^") либо последним (перед "]"), также можно использовать escape-символ \ как в "[\-]".
Для того чтобы включить символы "[", "]" или "^" в набор символов, поставьте их в конец (перед "]") или используйте escape-символ \.



Концы и начала строк

Проверка начала или конца строки производится с помощью метасимволов ^ и $.
Например, "^thing" соответствует строке, начинающейся с "thing". "thing$" соответствует строке, заканчивающейся на "thing".

В регулярных выражениях общего вида можно также проверять начало и конец всего текста. Но применительно к FileRenamer'у текст это имя файла/папки, т.е. строка.
Поэтому следующие операторы можно воспринимать как эквиваленты вышеприведённых.

"\`", "\A" начало текста
"\'", "\z", "\Z" конец текста


Операторы слова

\w   символ слова (эквивалентно выражению "[[:word:]]" - буквы, цифры, "_")
\W   символ не слова (эквивалентно выражению "[^[:word:]]")
\<   начало слова (например "\   конец слова (напрмер "out\>" соответствует "out" в "shout")
\b   граница слова (либо начало, либо конец)
\B   внутри слова


Обратные ссылки 

Обратная ссылка - это ссылка на предыдущее подвыражение (группа в скобках), уже совпавшее с некоторой подстрокой; ссылка на то, что совпало, а не на само регулярное выражение.

Обратная ссылка состоит и escape-символа "\" и следующей за ним цифры от "1" до "9", "\1" ссылается на первое подвыражение, "\2" на второе и т.д.
Например, выражение "(.*)\1" совпадает со строкой составленной из двух одинаковых частей, например "abcabc" или "xyzxyz".
Обратная ссылка на подвыражение, которое ни с чем не совпало даёт пустую строку.


Символы по коду 

В шаблоне можно указать символ для поиска по его коду.
Для этого используется следующий синтаксис: escape-символ "\", за ним ноль "0" и, наконец, восьмиричный код символа.
Например, "\023" обозначает символ с восьмиричным кодом 23.
Там где может появиться двусмысленность, используйте скобки чтобы разбить выражение: "\0103" - символ с кодом 103, "(\010)3" - символ с кодом 10 за которым идёт "3".
Можно также указывать символы по их шестнадцатиричному коду. Для этого поставьте "\x" и за ним строку шестнадцатиричных цифр, опционально заключённую в {}, например, \xf0 или \x{af}


Escape-символ 

Escape-символ "\" имеет несколько значений. С помощью него обозначается операторы, например, обратные ссылки или операторы слова.
Escape-символ может делать последующий символ обычным, например, "\*" есть обычный символ "*" а не квантификатор (умножитель).

Следующие escape-последовательности представлены в основном для совместимости с Perl'ом (значения \l \L \u и \U имеют некоторые отличия):
  \w   эквивалентно [[:word:]]
  \W   эквивалентно [^[:word:]]
  \s   эквивалентно [[:space:]]
  \S   эквивалентно [^[:space:]]
  \d   эквивалентно [[:digit:]]
  \D   эквивалентно [^[:digit:]]
  \l   эквивалентно [[:lower:]]
  \L   эквивалентно [^[:lower:]]
  \u   эквивалентно [[:upper:]]
  \U   эквивалентно [^[:upper:]]
  \C   любой символ, эквивалентно "."
  \Q   начало цитаты, все символы после этого оператора
       рассматриваются как обычные пока не встретиться \E
  \E   конец цитаты, завершает последовательность, начинающуюся с \Q





Синтаксис строки замены 


Поиск с использованием регулярных выражений в FileRenamer'е предполагает замену найденного некоторой строкой. В этой строке символы "\" и "&" являются специальными,
чтобы использовать их как обычные символы поставьте впереди escape-символ "\".

В строке замены распознаются следующие специальные последовательности:

\N, где N - цифра, заменяется на N'ый компонент выражения поиска (группу в скобках)
& заменяется на всю найденную подстроку, эквивалентно \0
Эти операторы можно использовать, например, при поиске выражения и последующего изменения порядка его компонентов.
Например, введите "(Годунов) (Борис)" в поле "Заменить:" и "\2 \1" в поле "На:", чтобы найти словосочетание «Годунов Борис» и заменить его на «Борис Годунов».


воскресенье, 1 декабря 2013 г.

Генерация нового названия, если файл с таким именем уже существует на PHP


Генерация нового названия, если файл с таким именем уже существует на PHP



function file_newname($path, $filename){
    if ($pos = strrpos($filename, '.')) {
           $name = substr($filename, 0, $pos);
           $ext = substr($filename, $pos);
    } else {
           $name = $filename;
    }
    $newpath = $path.'/'.$filename;
    $newname = $filename;
    $counter = 0;
    while (file_exists($newpath)) {
           $newname = $name .'_'. $counter . $ext;
           $newpath = $path.'/'.$newname;
           $counter++;
     }
    return $newname;
}


вторник, 26 ноября 2013 г.

PHP: Simplest Parse XML with Simplexml

Parser XML with PHP:


$xml_string = "<?xml version='1.0'?>
    <users>
       <user id='2' status='Admin'>
          <username>Mikki Mau</username>
          <useremail>mikki@mydomain.com</useremail>
       </user>
       <user id='3' status='User'>
          <username>Miki Mau</username>
          <useremail>mikki@mydomain.com</useremail>
       </user>
    </users>";
$xml = simplexml_load_string($xml_string);
foreach ($xml->user as $user) {
    //Get "id" and "status" attributes
    echo $user['id'].' ('.$user['status'].')<br>';
    //Get subnodes
    echo $user->username. '<br>';
    echo $user->useremail. '<br>';
}

RSS example on PHP and HTML



RSS файл
----------

<?php
 header("Content-Type: text/xml");
 echo "<?xml version=\"1.0\" encoding=\"windows-1251\"?>";
?>

<rss version="2.0">
<channel>
<title>Название канала</title>
<link>Сайт</link>
<description>Описание</description>
<language>Язык</language>

<item>
<title>название</title>
 <link>ссылка на заметку</link>
<description>текст</description>
<author>email автора</author>
<guid>ссылка на заметку</guid>
</item>

</channel>
</rss>

Фаил index
-------
<link rel="alternate" type="application/rss+xml" title="Lessons RSS" href="http://www.site.info/rss.php" />







РЕАЛИЗАЦИЯ


<?php
require(lala-lala.db);

header("Content-Type: text/xml");
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";

echo '<rss version="2.0">
<channel>';

$start=0;
$limit=50;
$db = new Mysqli;
$db->connectdb();
$request = ("SELECT * FROM `wp_posts` WHERE  `post_status` ='publish' AND `post_type` = 'post' ORDER BY ID DESC LIMIT $start, $limit");
$array=$db->mysqli_array($request);
$data = '<title>'.SITE_NAME.'</title>';
$data.= '<link>'.URL.'</link>';
$data.= '<description>'.DESCRIPTION.'</description>';
$data.= '<language>ru</language> ';

if ($array) {
foreach($array as $id=>$myrow) {
$data.= '<item>';
$data.= '<title>'.$myrow["post_title"].'</title>';
$data.= '<link>'.$myrow["post_name"].'</link>';
$data.= '<description>'.strip_tags(htmlspecialchars($myrow["post_excerpt"])).'</description>';
$data.= '<author>'.EMAIL.'</author>';
$data.= '<guid>'.$myrow["post_name"].'</guid>';
$data.= '</item>';
}
}

echo $data.'</channel>
</rss>';
// В шапку добавить: <link rel="alternate" type="application/rss+xml" title="RSS" href="http://www.site.info/rss.php" />
?>

Класс PHP-MySQLi-Database-Class-master





Пример реализации:


----.....

 'Inserted title',
'body' => 'Inserted body'
);
$results = $db->insert('posts', $insertData);
print_r($results);
?>





Сам класс: 


 * @author Josh Campbell
 * @copyright Copyright (c) 2010
 * @license http://opensource.org/licenses/gpl-3.0.html GNU Public License
 * @version 1.1
 **/
class MysqliDB {
/**
* Static instance of self
*
* @var object
*/
protected static $_instance;
/**
* MySQLi instance
*
* @var object
*/
protected $_mysqli;
/**
* The SQL query to be prepared and executed
*
* @var object
*/
protected $_query;
/**
* An array that holds where conditions 'fieldname' => 'value'
*
* @var array
*/
protected $_where = array();
/**
* Dynamic type list for where condition values
*
* @var array
*/
protected $_whereTypeList;
/**
* Dynamic type list for table data values
*
* @var array
*/
protected $_paramTypeList;
/**
* Dynamic array that holds a combination of where condition/table data value types and parameter referances
*
* @var array
*/
protected $_bindParams = array(''); // Create the empty 0 index
public function __construct($host, $username, $password, $db) {
$this->_mysqli = new mysqli($host, $username, $password, $db)
or die('There was a problem connecting to the database');
self::$_instance = $this;
}
/**
* A method of returning the static instance to allow access to the
* instantiated object from within another class.
* Inheriting this class would require reloading connection info.
*
* @uses $db = MySqliDb::getInstance();
*
* @return object Returns the current instance.
*/
public static function getInstance()
{
return self::$_instance;
}
/**
* Reset states after an execution
*
* @return object Returns the current instance.
*/
protected function reset()
{
$this->_where = array();
$this->_bindParams = array(''); // Create the empty 0 index
unset($this->_query);
unset($this->_whereTypeList);
unset($this->_paramTypeList);
}
/**
* Pass in a raw query and an array containing the parameters to bind to the prepaird statement.
*
* @param string $query Contains a user-provided query.
* @param array $bindData All variables to bind to the SQL statment.
* @return array Contains the returned rows from the query.
*/
public function rawQuery($query, $bindParams = NULL)
{
$this->_query = filter_var($query, FILTER_SANITIZE_STRING);
$stmt = $this->_prepareQuery();
if (gettype($bindParams) === 'array') {
$params = array(''); // Create the empty 0 index
foreach ($bindParams as $prop => $val) {
$params[0] .= $this->_determineType($val);
array_push($params, $bindParams[$prop]);
}
                call_user_func_array(array($stmt, "bind_param"),$this->refValues($params));
}
$stmt->execute();
$this->reset();
$results = $this->_dynamicBindResults($stmt);
return $results;
}
/**
*
* @param string $query Contains a user-provided select query.
* @param int $numRows The number of rows total to return.
* @return array Contains the returned rows from the query.
*/
public function query($query, $numRows = NULL)
{
$this->_query = filter_var($query, FILTER_SANITIZE_STRING);
$stmt = $this->_buildQuery($numRows);
$stmt->execute();
$this->reset();
$results = $this->_dynamicBindResults($stmt);
return $results;
}
/**
* A convenient SELECT * function.
*
* @param string $tableName The name of the database table to work with.
* @param integer $numRows The number of rows total to return.
* @return array Contains the returned rows from the select query.
*/
public function get($tableName, $numRows = NULL)
{
$this->_query = "SELECT * FROM $tableName";
$stmt = $this->_buildQuery($numRows);
$stmt->execute();
$this->reset();
$results = $this->_dynamicBindResults($stmt);
return $results;
}
/**
*
* @param _query = "INSERT into $tableName";
$stmt = $this->_buildQuery(NULL, $insertData);
$stmt->execute();
$this->reset();
($stmt->affected_rows) ? $result = $stmt->insert_id : $result = false;
return $result;
}
/**
* Update query. Be sure to first call the "where" method.
*
* @param string $tableName The name of the database table to work with.
* @param array $tableData Array of data to update the desired row.
* @return boolean
*/
public function update($tableName, $tableData)
{
$this->_query = "UPDATE $tableName SET ";
$stmt = $this->_buildQuery(NULL, $tableData);
$stmt->execute();
$this->reset();
($stmt->affected_rows) ? $result = true : $result = false;
return $result;
}
/**
* Delete query. Call the "where" method first.
*
* @param string $tableName The name of the database table to work with.
* @param integer $numRows The number of rows to delete.
* @return boolean Indicates success. 0 or 1.
*/
public function delete($tableName, $numRows = NULL) {
$this->_query = "DELETE FROM $tableName";
$stmt = $this->_buildQuery($numRows);
$stmt->execute();
$this->reset();
($stmt->affected_rows) ? $result = true : $result = false;
return $result;
}
/**
* This method allows you to specify multipl (method chaining optional) WHERE statements for SQL queries.
*
* @uses $MySqliDb->where('id', 7)->where('title', 'MyTitle');
*
* @param string $whereProp The name of the database field.
* @param mixed $whereValue The value of the database field.
*/
public function where($whereProp, $whereValue)
{
$this->_where[$whereProp] = $whereValue;
return $this;
}

        /**
* This methods returns the ID of the last inserted item
*
* @return integer The last inserted item ID.
*/
public function getInsertId()
{
        return $this->_mysqli->insert_id;
    }
/**
* Escape harmful characters which might affect a query.
*
* @param string $str The string to escape.
* @return string The escaped string.
*/
public function escape ( $str )
{
return $this->_mysqli->real_escape_string ( $str );
}
/**
* This method is needed for prepared statements. They require
* the data type of the field to be bound with "i" s", etc.
* This function takes the input, determines what type it is,
* and then updates the param_type.
*
* @param mixed $item Input to determine the type.
* @return string The joined parameter types.
*/
protected function _determineType($item)
{
switch (gettype($item)) {
case 'NULL':
case 'string':
return 's';
break;
case 'integer':
return 'i';
break;
case 'blob':
return 'b';
break;
case 'double':
return 'd';
break;
}
}
/**
* Abstraction method that will compile the WHERE statement,
* any passed update data, and the desired rows.
* It then builds the SQL query.
*
* @param int $numRows The number of rows total to return.
* @param array $tableData Should contain an array of data for updating the database.
* @return object Returns the $stmt object.
*/
protected function _buildQuery($numRows = NULL, $tableData = NULL)
{
(gettype($tableData) === 'array') ? $hasTableData = true : $hasTableData = false; (!empty($this->_where )) ? $hasConditional = true : $hasConditional = false;
// Did the user call the "where" method?
if (!empty($this->_where)) {
// if update data was passed, filter through and create the SQL query, accordingly.
if ($hasTableData) {
$i = 1;
$pos = strpos($this->_query, 'UPDATE');
if ( $pos !== false) {
foreach ($tableData as $prop => $value) {
// determines what data type the item is, for binding purposes.
$this->_paramTypeList .= $this->_determineType($value);
// prepares the reset of the SQL query.
($i === count($tableData)) ?
$this->_query .= $prop . ' = ?':
$this->_query .= $prop . ' = ?, ';
$i++;
}
}
}
//Prepair the where portion of the query
$this->_query .= ' WHERE '; $i = 1;
foreach ($this->_where as $column => $value) {
// Determines what data type the where column is, for binding purposes.
$this->_whereTypeList .= $this->_determineType($value);
// Prepares the reset of the SQL query.
($i === count($this->_where)) ?
$this->_query .= $column . ' = ?':
$this->_query .= $column . ' = ? AND ';
$i++;
}
}
// Determine if is INSERT query
if ($hasTableData) {
$pos = strpos($this->_query, 'INSERT');
if ($pos !== false) {
//is insert statement
$keys = array_keys($tableData);
$values = array_values($tableData);
$num = count($keys);
// wrap values in quotes
foreach ($values as $key => $val) {
$values[$key] = "'{$val}'";
$this->_paramTypeList .= $this->_determineType($val);
}
$this->_query .= '(' . implode($keys, ', ') . ')';
$this->_query .= ' VALUES(';
while ($num !== 0) {
($num !== 1) ? $this->_query .= '?, ' : $this->_query .= '?)';
$num--;
}
}
}
// Did the user set a limit
if (isset($numRows)) {
$this->_query .= " LIMIT " . (int) $numRows;
}
// Prepare query
$stmt = $this->_prepareQuery();
// Prepare table data bind parameters
if ($hasTableData) {
$this->_bindParams[0] = $this->_paramTypeList;
foreach ($tableData as $prop => $val) {
array_push($this->_bindParams, $tableData[$prop]);
}
}
// Prepare where condition bind parameters
if($hasConditional) {
if ($this->_where) {
$this->_bindParams[0] .= $this->_whereTypeList;
foreach ($this->_where as $prop => $val) {
array_push($this->_bindParams, $this->_where[$prop]);
}
} }
// Bind parameters to statment
if ($hasTableData || $hasConditional){
call_user_func_array(array($stmt, "bind_param"),$this->refValues($this->_bindParams));
}
return $stmt;
}
/**
* This helper method takes care of prepared statements' "bind_result method
* , when the number of variables to pass is unknown.
*
* @param object $stmt Equal to the prepared statement object.
* @return array The results of the SQL fetch.
*/
protected function _dynamicBindResults($stmt)
{
$parameters = array();
$results = array();
$meta = $stmt->result_metadata();
$row = array();
while ($field = $meta->fetch_field()) {
$row[$field->name] = NULL;
$parameters[] = &$row[$field->name];
}
        call_user_func_array(array($stmt, "bind_result"),$parameters);
while ($stmt->fetch()) {
$x = array();
foreach ($row as $key => $val) {
$x[$key] = $val;
}
array_push($results, $x);
}
return $results;
}
/**
* Method attempts to prepare the SQL query
* and throws an error if there was a problem.
*/
protected function _prepareQuery()
{
if (!$stmt = $this->_mysqli->prepare($this->_query)) {
trigger_error("Problem preparing query ($this->_query) ".$this->_mysqli->error, E_USER_ERROR);
}
return $stmt;
}
public function __destruct()
{
$this->_mysqli->close();
}
function refValues($arr)
{
//Reference is required for PHP 5.3+
if (strnatcmp(phpversion(),'5.3') >= 0) {
        $refs = array();
        foreach($arr as $key => $value)
            $refs[$key] = &$arr[$key];
        return $refs;
    }
  return $arr;
}
} // END class

воскресенье, 24 ноября 2013 г.

Перекодировать текст из utf-8 в windows-1251(cp-1251) на PHP

Перекодировать текст из utf-8 в windows-1251(cp-1251) на PHP 



<?php echo iconv("utf-8", "windows-1251", "Пора переходить на cp-1251."); ?>

Простой класс для работы с базой данных

Простой класс для работы с базой данных



class DB {
    private static $instance;
    private $MySQLi;
    private function __construct(array $dbOptions){
        $this->MySQLi = @ new mysqli($dbOptions['db_host'],$dbOptions['db_user'], $dbOptions['db_pass'],$dbOptions['db_name'] );
        if (mysqli_connect_errno()) {
             throw new Exception('Ошибка базы данных.');
        }
        $this->MySQLi->set_charset("utf8");
    }
    public static function init(array $dbOptions){
        if(self::$instance instanceof self){
            return false;
        }
        self::$instance = new self($dbOptions);
    }
    public static function getMySQLiObject(){
        return self::$instance->MySQLi;
    }
    public static function query($q){
        return self::$instance->MySQLi->query($q);
    }
    public static function esc($str){
        return self::$instance->MySQLi->real_escape_string(htmlspecialchars($str));
    }
    public static function insert_id($str){
        return self::$instance->MySQLi->insert_id;
    }
    public static function affected_rows(){
        return self::$instance->MySQLi->affected_rows;
    }
}



Пример работы с классом


<?php
/* Конфигурация базы данных. Добавьте свои данные */
$dbOptions = array(
    'db_host' => 'localhost',
    'db_user' => '',
    'db_pass' => '',
    'db_name' => ''
);
//Имя таблицы, в которой хранятся заметки
$table_name = 'articles';
//Подключаем класс для работы с базой данных
require "db.class.php";
// Соединение с базой данных
DB::init($dbOptions);
$page_id = (!empty($_GET['id']))? intval($_GET['id']): false;
if(!$page_id){
 
    //Выбираем 3 заметки из базы данных
    $result = DB::query('SELECT * FROM '.$table_name.' LIMIT 3');
 
    //Здесь будет храниться список заметок
    $articles = array();
 
    while($row = $result->fetch_assoc()){
        $articles[] = $row;
    }
}
else{
    //Выбираем заметку из базы данных по переданному id
    $result = DB::query('SELECT * FROM '.$table_name.' WHERE id='.$page_id.' LIMIT 1');
 
    //Если такой заметки нет в базе данных
    //выводим 404 ошибку
    if(!$post = $result->fetch_assoc()){
     
        header("HTTP/1.0 404 Not Found");
        header("HTTP/1.1 404 Not Found");
        header("Status: 404 Not Found");
        die('Нет такой заметки');
     
    }
}
?>

суббота, 23 ноября 2013 г.

Сканирование папки на PHP с русскими именами файлов и папок


Сканирование папки на PHP с русскими именами файлов и папок в том числе:


$uri = urldecode(mb_substr($_SERVER["REQUEST_URI"], 0, -1));

function treeList($path = "/") {
  $prefix = ($path == "") ? $_SERVER['DOCUMENT_ROOT'] : "";
  $return = preg_replace("#(.*)/(.*)$#u","\$1",$path);
  echo ' <ul> ';
  echo ' <li><a href="javascript:history.go(-1);'.$return.'">[...назад...]</a></li> ';
  foreach (glob($_SERVER['DOCUMENT_ROOT']."$path/*") as $item) {
    $isdir = (is_dir($item)) ? true : false;
    $item = str_replace(array($_SERVER['DOCUMENT_ROOT'],"//"),array("","/"),$item);
$item = iconv("utf-8", "windows-1251", $item);
    if ($isdir) echo ' <li><b><a href="'.$item.'">'.$item.'</a></b></li> ';
     else if(strpos($item,'index.php')===false) echo ' <li><a href="'.$item.'">'.$item.'</a></li> ';
    }
  echo ' </ul> ';
  }
treeList("/".$uri);




В файле .htaccess пишем:

AddDefaultCharset windows-1251
AddCharset windows-1251 *
<IfModule mod_charset.c>
CharsetSourceEnc windows-1251
CharsetDefault windows-1251
</IfModule>
 




Постоянные читатели

Популярные сообщения