Официальный сайт фреймворка Kohana пару месяцев назад был заблокирован многими российскими провайдерами. Не скажу, что я поклонник этого фреймворка, но в последнее время стал очень часто его использовать. Конечно, мне необходимо время от времени заглядывать в документацию, чтобы что-нибудь изучить, узнать какие-нибудь тонкости и т.д. И до недавнего времени все было просто замечательно, но на этом же IP адресе появился некий сайт, распространяющий курительные смеси и прочую дурь. Вот и заблокировали провайдеры айпишник целиком и полностью. Кому какая разница сколько на нем сайтов, лишь бы одноклассники, вконтакте и YouTube работали.
Показаны сообщения с ярлыком php. Показать все сообщения
Показаны сообщения с ярлыком php. Показать все сообщения
8 февраля 2014 г.
1 марта 2012 г.
Интересные знания о переменных в PHP
PHP по-русски опубликовал новую интересную статью о переменных в PHP. Оказывается, что имя переменной может состоять не только из латинских символов и всего лишь нескольких из таблицы ASCII, но абсолютно из любых! Кому интересно, читаем дальше!
4 июля 2011 г.
Как проверить качество входящего трафика на ajax?
Вот есть такое решение, как вести учет входящего трафика (используется технология ajax), которое описано в статье «Пишем скрипт проверки качества входящего трафика». Естественно, что каждый придумает по-своему, как это лучше организовать, и это довольно интересно было бы обсудить, но помимо этого, у меня зародился вопрос, еще при написании самого скрипта: Как идентифицировать пользователя? Мне кажется, что данный способ, мягко говоря, не очень удачный. Но если не так, то как?
24 мая 2011 г.
Рисуем градиент на PHP
Как-то мне поступил заказ, чтобы я сделал выбор цвета как в Photoshop. Конечно, один в один я его не сделал, ну, этого и не требовалось, но суть не в этом. Для того, чтобы осуществить нечто подобное, необходимо знать по какому цвету ты щелкаешь. Для этого оказалось проще самому программным образом нарисовать такой квадратик, тогда я буду на 100% уверен какой пиксель, какой цвет содержит. Т.е. его шестнадцатеричный код.
Вот, что у меня получилось.
Теперь я продемонстрирую сам код:
Тут логика проста. Создаем изображение размером 128х128. Потом для каждой строчки определяем правило, по которому будут происходить изменения цвета каждого следующего пикселя.
Переменные $dec_r, $dec_g, $dec_b отвечают за шаг каждого цвета. Т.е. сначала у нас $dec_r = 0, $dec_g = 2 и $dec_b = 2. Это означает, что красный цвет изменятся не будет. А зеленый и синий будут уменьшаться на 2. Так будет только в первой строчке. Во второй правило изменится для шага зеленого цвета. Его шаг замедлится и не достигнет нуля. Таким образом, в конце второй строчки у нас уже будет не чистый красный цвет, а начнет приближаться к желтому. На 21-й строчке значение зеленого цвета практический перестает изменятся и, начиная с 22-й строчке оно будет равно 255. Но теперь начинает увеличиваться шаг красного цвета, когда он достигнет 2, начинает уменьшаться шаг синего цвета и т.д. Таким образом, мы пройдем по всей цветовой гамме. Конечно, частота дискретизации не позволит нам сделать это более плавно уместившись в такой маленький участок экрана, но наш глаз скачков цвета не заметит.
Дорогие читатели. В следующей статье я хочу вам рассказать о том, как осуществить выбор цвета как в photoshop на javascript. Если же вас интересуют другие темы, то пишите, обсудим.
До новых встреч!
Вот, что у меня получилось.
Теперь я продемонстрирую сам код:
<?php
$im = imagecreatetruecolor(128,128);
$dec_r = 0;
$dec_g = 2;
$dec_b = 2;
for($y = 0; $y < 128; $y++){
$red = 255;
$green = 255;
$blue = 255;
if($y < 22) $dec_g = (256 - $y * 12) / 128;
else if($y > 21 && $y < 43){
$dec_g = 0;
$dec_r = ($y * 12 - 256) / 128;
}
else if($y > 42 && $y < 65){
$dec_r = 2;
$dec_b = (768 - $y * 12) / 128;
}
else if($y > 64 && $y < 86){
$dec_b = 0;
$dec_g = ($y * 12 - 768) / 128;
}
else if($y > 85 && $y < 107){
$dec_g = 2;
$dec_r = (1280 - $y * 12) / 128;
}
else if($y > 106){
$dec_r = 0;
$dec_b = ($y * 12 - 1280) / 128;
}
for($x = 0; $x < 128; $x++){
$color_now = imagecolorallocate($im, round($red - $x * $dec_r), round($green - $x * $dec_g),round($blue - $x * $dec_b));
imagesetpixel($im, $x, $y, $color_now);
}
}
header("Content-type: image/png");
imagepng($im);
imagedestroy($im);
?>
Тут логика проста. Создаем изображение размером 128х128. Потом для каждой строчки определяем правило, по которому будут происходить изменения цвета каждого следующего пикселя.
Переменные $dec_r, $dec_g, $dec_b отвечают за шаг каждого цвета. Т.е. сначала у нас $dec_r = 0, $dec_g = 2 и $dec_b = 2. Это означает, что красный цвет изменятся не будет. А зеленый и синий будут уменьшаться на 2. Так будет только в первой строчке. Во второй правило изменится для шага зеленого цвета. Его шаг замедлится и не достигнет нуля. Таким образом, в конце второй строчки у нас уже будет не чистый красный цвет, а начнет приближаться к желтому. На 21-й строчке значение зеленого цвета практический перестает изменятся и, начиная с 22-й строчке оно будет равно 255. Но теперь начинает увеличиваться шаг красного цвета, когда он достигнет 2, начинает уменьшаться шаг синего цвета и т.д. Таким образом, мы пройдем по всей цветовой гамме. Конечно, частота дискретизации не позволит нам сделать это более плавно уместившись в такой маленький участок экрана, но наш глаз скачков цвета не заметит.
Дорогие читатели. В следующей статье я хочу вам рассказать о том, как осуществить выбор цвета как в photoshop на javascript. Если же вас интересуют другие темы, то пишите, обсудим.
До новых встреч!
23 мая 2011 г.
Парсер BBcode на PHP для нашего редактора (заключительная статья)
Здравствуйте! Сегодня я продолжу написание редактора, вернее скрипт, который будет переводить bb-код в нужный вид. В прошлой статье мы дописали наш редактор на javascript. Мы научили его вставлять необходимые теги в необходимое место. Теперь нам нужен скрипт на стороне сервера, который это будет сохранять в файл или базу данных, и еще один скрипт который все это будет переводить в надлежащий вид.
Я решил поступить следующим образом. Данные будут храниться в bbcode и парситься при выдаче. Чтобы при редактировании не надо было переводить из html опять в bbcode. Кто с этим не согласен, давайте поспорим. :)
Итак, я создаю файл save.php
Все данные я предварительно обрабатываю функцией htmlspecialchars(), и просто помещаю в текстовый файл for_parse.txt. После этих незамысловатых действий я предоставляю пользователю возможность просмотреть результат в том виде, в котором все это будет отображаться на сайте.
Теперь создаем следующий файл pars.php
И получился вот такой файл. Теперь настала пора его разобрать. Сначала мы считываем данные из файла, который содержит данные введенные пользователем в виде bbcode. И отображаем результат вызова функции pars_bb(), которой для парсинга мы передали данные пользователя.
Что же делает данная функция? Она по регулярным выражениям ищет находит то, что надо заменить и заменяет. Некоторые теги теги мы меняем, применяя простую функцию str_replace() без preg_match_all().
Дальше мы видим, что тег [video] у нас преобразуется не как все. А дело в том, что если видео вставлено с youtube, то оно заменяется фреймом с видео-плеером. В расчете на то, что подобные замены могут быть довольно-таки разные, я некоторые параметры вынес в отдельный файл config.php
Взглянув, на файл конфигурации и функции, которые его применяют, сразу становится ясно, что и для чего необходимо. Думаю, что здесь ничего объяснять не надо. Конечно, если у кого-то возникнут вопросы, спрашивайте, буду отвечать. Если кто-то желает посмотреть все файлы, то их можно скачать одним архивом здесь.
До новых встреч!
Я решил поступить следующим образом. Данные будут храниться в bbcode и парситься при выдаче. Чтобы при редактировании не надо было переводить из html опять в bbcode. Кто с этим не согласен, давайте поспорим. :)
Итак, я создаю файл save.php
<?php
$txt = htmlspecialchars($_POST['text']);
file_put_contents('for_pars.txt', $txt);
?>
<a href="pars.php">посмотреть результат</a>
Все данные я предварительно обрабатываю функцией htmlspecialchars(), и просто помещаю в текстовый файл for_parse.txt. После этих незамысловатых действий я предоставляю пользователю возможность просмотреть результат в том виде, в котором все это будет отображаться на сайте.
Теперь создаем следующий файл pars.php
<?php
$txt = file_get_contents('for_pars.txt');
function pars_bb($txt){
$txt = str_replace('[b]', "<b>", $txt);
$txt = str_replace('[/b]', "</b>", $txt);
$txt = str_replace('[u]', "<u>", $txt);
$txt = str_replace('[/u]', "</u>", $txt);
$txt = str_replace('[i]', "<i>", $txt);
$txt = str_replace('[/i]', "</i>", $txt);
$txt = str_replace('[s]', "<span style=\"text-decoration: line-through;\">", $txt);
$txt = str_replace('[/s]', "</span>", $txt);
$txt = str_replace('[left]', "<div align=\"left\">", $txt);
$txt = str_replace('[/left]', "</div>", $txt);
$txt = str_replace('[center]', "<div align=\"center\">", $txt);
$txt = str_replace('[/center]', "</div>", $txt);
$txt = str_replace('[right]', "<div align=\"right\">", $txt);
$txt = str_replace('[/right]', "</div>", $txt);
preg_match_all('/\[link href=([^]]*)]/i', $txt, $match);
if(count($match[0]) > 0){
foreach($match[1] as $key => $val)
$txt = str_replace('[link href=' . $val . ']', '<a href="' . $val . '">', $txt);
$i++;
}
preg_match_all('/\[image]([^[]*)\[\/image]/i', $txt, $match);
if(count($match[0]) > 0){
foreach($match[1] as $val)
$txt = str_replace('[image]'.$val.'[/image]', "<img src=\"$val\" />", $txt);
$i++;
}
preg_match_all('/\[video]([^[]*)\[\/video]/i', $txt, $match);
if(count($match[0]) > 0){
foreach($match[1] as $val)
$txt = get_ifrm_src($val) ? str_replace('[video]'.$val.'[/video]', get_ifrm_src($val), $txt) : str_replace('[video]'.$val.'[/video]', "<a href=\"" . $val . "\">Ссылка на видео</a>", $txt);
$i++;
}
preg_match_all('/\[email=([^\]]*)]/i', $txt, $match);
if(count($match[0]) > 0){
foreach($match[1] as $key => $val)
$txt = str_replace('[email='.$val.']', "<a href=\"mailto:$val\">", $txt);
$i++;
}
preg_match_all('/\[media]([^[]*)\[\/media]/i', $txt, $match);
if(count($match[0]) > 0){
foreach($match[1] as $val)
$txt = str_replace('[media]'.$val.'[/media]', "<a href=\"$val\">media</a>", $txt);
$i++;
}
preg_match_all('/\[font=([^\]]*)]/i', $txt, $match);
if(count($match[0]) > 0){
foreach($match[1] as $key => $val)
$txt =str_replace('[font='.$val.']', "<span style=\"font-family: $val;\">", $txt);
$i++;
}
preg_match_all('/\[size=([^\]]*)]/i', $txt, $match);
if(count($match[0]) > 0){
foreach($match[1] as $key => $val)
$txt =str_replace('[size='.$val.']', "<font size=\"$val\">", $txt);
$i++;
}
preg_match_all('/\[color=([^\]]*)]/i', $txt, $match);
if(count($match[0]) > 0){
foreach($match[1] as $key => $val)
$txt =str_replace('[color='.$val.']', "<font color=\"$val\">", $txt);
$i++;
}
$txt =str_replace('[/color]', "</font>", $txt);
$txt =str_replace('[/size]', "</font>", $txt);
$txt =str_replace('[/font]', "</span>", $txt);
$txt =str_replace('[/code]', "</pre>", $txt);
$txt =str_replace('[code]', "<pre>", $txt);
$txt = str_replace('[quote]', "<div class=\"quote\">", $txt);
$txt = str_replace('[/quote]', "</div>", $txt);
$txt = str_replace('[/email]', "</a>", $txt);
$txt = str_replace('[/link]', "</a>", $txt);
$txt = str_replace('[indent]', "<div style=\"padding:20px\">", $txt);
$txt = str_replace('[/indent]', "</div>", $txt);
preg_match_all('/:(\w*):/i', $txt, $match);
if(count($match[0]) > 0){
foreach($match[1] as $val)
$txt = file_exists("./images/$val.gif") ? str_replace(":$val:", "<img class=\"smile\" src=\"./images/$val.gif\" />", $txt) : $txt;
$i++;
}
else $txt = find_video($txt);
return $txt;
}
function get_ifrm_src($url){
include('config.php');
preg_match('/http:\/\/([^\/]*)\/(.*)/i', $url, $match);
if(count($match[1]) == 0) return false;
$pat = $pat_ar[$match[1]];
$str = $pat['tpl'];
$player = $pat['player'];
if($str){
preg_match($pat['pat'], $match[2], $s_match);
if(count($s_match)){
foreach($s_match as $key => $s_val)
if($key) $str = str_replace('['.$key.']', "$s_val", $str);
$str = str_replace("[url]", $str, $player);
}
}
return $str == $pat['tpl'] ? false : $str;
}
function find_video($txt){
include('config.php');
if(count($pat_ar) == 0) return $txt;
foreach($pat_ar as $val){
if(preg_match_all($val['url_pat'], $txt, $match)){
foreach($match[0] as $val)
$txt = str_replace($val, (get_ifrm_src($val) ? get_ifrm_src($val) : $val), $txt);
}
}
return $txt;
}
echo pars_bb($txt);
?>
И получился вот такой файл. Теперь настала пора его разобрать. Сначала мы считываем данные из файла, который содержит данные введенные пользователем в виде bbcode. И отображаем результат вызова функции pars_bb(), которой для парсинга мы передали данные пользователя.
Что же делает данная функция? Она по регулярным выражениям ищет находит то, что надо заменить и заменяет. Некоторые теги теги мы меняем, применяя простую функцию str_replace() без preg_match_all().
Дальше мы видим, что тег [video] у нас преобразуется не как все. А дело в том, что если видео вставлено с youtube, то оно заменяется фреймом с видео-плеером. В расчете на то, что подобные замены могут быть довольно-таки разные, я некоторые параметры вынес в отдельный файл config.php
<?php
$pat_ar = array();
$pat_ar['www.youtube.com'] = array('url_pat' => '/http:\/\/www.youtube.com[^\s]+/i', 'pat' => '/\?v=([^&]*)/i', 'tpl' => 'http://www.youtube.com/embed/[1]', 'player' => '<iframe width="425" height="349" src="[url]" frameborder="0" allowfullscreen></iframe>');
?>
Взглянув, на файл конфигурации и функции, которые его применяют, сразу становится ясно, что и для чего необходимо. Думаю, что здесь ничего объяснять не надо. Конечно, если у кого-то возникнут вопросы, спрашивайте, буду отвечать. Если кто-то желает посмотреть все файлы, то их можно скачать одним архивом здесь.
До новых встреч!
Подписаться на:
Сообщения (Atom)

