Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Подсветка результатов поиска на странице

05.02.2013 | Категория: Web-мастеру и не только | Автор: ManHunter
Сложно представить современный web-сайт без поиска. И хорошим тоном считается не просто выводить все страницы, на которых был найден запрошенный результат, но и как-нибудь выделять искомые слова в тексте. Если контент сайта представляет собой обычный текст без html-разметки, то тут все просто, достаточно использовать что-то типа str_replace. А как быть, если на странице имеются html-теги, и надо выделить только тот текст, который не заключен внутри тегов? Например, нам надо выделить слово "поиск" в такой тестовой строке:
  1. Для поиска и просмотра <a href="/search" title="Результаты поиска">результатов
  2. поиска</aпройдите по поисковой ссылке.
После простой замены она превратится в нечто чудовищное:
  1. Для <b>поиск</b>а и просмотра <a href="/search" title="Результаты <b>поиск</b>а">
  2. результатов <b>поиск</b>а</aпройдите по <b>поиск</b>овой ссылке.
Как видите, текст в атрибутах title нарушен. Это простейший пример, на деле это может привести к полному развалу верстки, а то и еще хуже. При правильно сформированных поисковых запросах злоумышленники смогут даже внедрить в код страницы вредоносные скрипты. Для решения этой проблемы воспользуемся регулярными выражениями:
  1. // Искомая строка для подсветки на странице
  2. $search 'html';
  3. // Создаем строку для регулярного выражения
  4. $pattern "/((?:^|>)[^<]*)(".$search.")/si";
  5. // Подсвеченная строка
  6. $replace '$1<b style="color:#FF0000; background:#FFFF00;">$2</b>';
  7. // Заменяем
  8. $html preg_replace($pattern$replace$html);
Код также немного упрощен для удобства восприятия. В реальных проектах при составлении регулярного выражения $pattern надо обязательно экранировать в искомой строке все служебные символы, которые могут быть использованы в регулярных выражениях.

Читать статью целиком »
Просмотров: 12345 | Комментариев: 7

Удаленное управление питанием сервера через Rack PDU

15.12.2012 | Категория: Web-мастеру и не только | Автор: ManHunter

Удаленное управление питанием сервера через Rack PDU

Когда-то по работе возникла необходимость автоматизированного управления серверами в стойке дата-центра. Вопрос с контролем за питанием был решен через power-свич (Switched Rack PDU), который имел возможность удаленного управления по telnet. Для эмуляции действий пользователя я написал вот такой небольшой класс на PHP. Может быть пригодится кому-нибудь еще.

Читать статью целиком »
Просмотров: 5260 | Комментариев: 0

Оценка качества изображения для печати

15.10.2012 | Категория: Web-мастеру и не только | Автор: ManHunter

Оценка качества изображения для печати

Качество изображения измеряется в количествах пикселей (точек) на дюйм (1 дюйм = 25.4 мм), единица измерения - dpi (Dots Per Inch). К типографской печати обычно принимаются изображения не менее 150 dpi, а вот для фотопечати качество должно быть уже 300 dpi и больше. Однако, при оценке качества изображения обязательно надо учитывать и размер печати. К примеру, исходный файл из цифромыльницы с разрешением 1200х900 пикселов будет неплохо смотреться на фотокарточке 10х15 см, но для печати на плакате его качества будет недостаточно. А кадры с Nikon D800 разрешением 7360х4912 пикселов можно без проблем распечатать на формате A1 и повесить на стенку.

Для вычисления dpi надо желаемые размеры печати перевести в дюймы, а затем поделить разрешение исходного файла на эти значения по ширине и высоте. Полученные значения dpi и будут искомым результатом оценки качества изображения. Осталось оформить это все вот в такую несложную функцию:
  1. // Функция для расчета dpi изображения
  2. function get_dpi($picture$print_x$print_y) {
  3.     if (file_exists($picture)) {
  4.         list ($x,$y)=GetImageSize($picture);
  5.         if ($x && $y && $print_x && $print_y) {
  6.             // "Повернуть" изображение под размер печати
  7.             if ($print_x<$print_y) {
  8.                 if ($x>$y) {
  9.                     list ($x,$y)=array($y,$x);
  10.                 }
  11.             }
  12.             // Посчитать dpi по ширине и высоте
  13.             $dpi=array(
  14.                 'dpi_x'=>intval($x/($print_x/2.54)),
  15.                 'dpi_y'=>intval($y/($print_y/2.54))
  16.             );
  17.             return $dpi;
  18.         }
  19.         else {
  20.             return false;
  21.         }
  22.     }
  23.     else {
  24.         return false;
  25.     }
  26. }
Параметры функции: $picture - путь к файлу с изображением, $print_x - ширина печати в сантиметрах, $print_y - высота печати в сантиметрах. На выходе массив со значениями dpi по высоте и ширине для данного изображения или false, если файл отсутствует, имеет неправильный формат или заданы неправильные размеры печати. В случае необходимости изображение будет "повернуто" под размер печати.

Читать статью целиком »
Просмотров: 6718 | Комментариев: 2

Скрипт для проверки местонахождения и статуса посылок

21.06.2012 | Категория: Web-мастеру и не только | Автор: ManHunter
Для отслеживания почтовых отправлений на сайте Почты России сделана специальная страничка. Когда вы ждете одну-две посылки, то можно воспользоваться ей. Для автоматического отслеживания нескольких посылок также есть специальные сервисы, они самостоятельно опрашивают сайт Почты и сохраняют полученные результаты у себя в базе. Но для отслеживания большого числа посылок, как правило, на подобных сервисах требуется переходить на платные тарифы. Когда я столкнулся с такой ситуацией, то вариант с оплатой, естественно, сразу же был отвергнут как неприемлемый. Проще было самому написать некое подобие такого сервиса, но заточенного под свои нужды. Вот что у меня получилось:
  1. <?
  2. // Массив с трек-номерами посылок
  3. // заполняйте его по аналогии трек-номерами своих посылок
  4. $codes=array('RA111111111CN''RA222222222CN''RA33333333CN');
  5.  
  6. // Массив с результатами отслеживания
  7. $status=array();
  8.  
  9. $link='http://www.russianpost.ru/resp_engine.aspx?Path='.
  10.       'rp/servise/ru/home/postuslug/trackingpo';
  11.  
  12. foreach ($codes as $code) {
  13.     // Подготовка запроса cURL
  14.     $ch curl_init();
  15.     curl_setopt($chCURLOPT_URL$link);
  16.     curl_setopt($chCURLOPT_HEADER0);
  17.     curl_setopt($chCURLOPT_POST1);
  18.     curl_setopt($chCURLOPT_RETURNTRANSFER1);
  19.     curl_setopt($chCURLOPT_POSTFIELDS'entryBarCode='.$code.
  20.                 '&BarCode='.$code.'&searchsign=1');
  21.  
  22.     // Отправка POST-запроса на сервер и получение страницы результата
  23.     $grab=curl_exec($ch);
  24.  
  25.     if (eregi('value="([0-9]+)"',$grab,$pocket)) {
  26.         // установка URL и других необходимых параметров
  27.         curl_setopt($chCURLOPT_URL$link);
  28.         curl_setopt($chCURLOPT_HEADER1);
  29.         curl_setopt($chCURLOPT_POST1);
  30.         curl_setopt($chCURLOPT_RETURNTRANSFER1);
  31.         curl_setopt($chCURLOPT_POSTFIELDS'key='.$pocket[1]);
  32.  
  33.         // загрузка страницы
  34.         $grab=curl_exec($ch);
  35.  
  36.         // установка URL и других необходимых параметров
  37.         curl_setopt($chCURLOPT_URL$link);
  38.         curl_setopt($chCURLOPT_HEADER1);
  39.         curl_setopt($chCURLOPT_POST1);
  40.         curl_setopt($chCURLOPT_RETURNTRANSFER1);
  41.         curl_setopt($chCURLOPT_POSTFIELDS'entryBarCode='.$code.
  42.                     '&BarCode='.$code.'&searchsign=1');
  43.  
  44.         // загрузка страницы
  45.         $grab=curl_exec($ch);
  46.     }
  47.  
  48.     // Фикс кодировки полученной страницы
  49.     $grab=mb_convert_encoding($grab'Windows-1251''UTF-8');
  50.  
  51.     // Небольшой фикс для упрощения парсинга страницы
  52.     $grab=eregi_replace('<a href=javascript\:Wind\([^\(]*\)>','',$grab);
  53.  
  54.     preg_match_all('/<tr align="center"><td>([^<]+)<\/td><td>([^<]+)'.
  55.       '<\/td><td>[^<]*<\/td><td>([^<]+)<\/td><td>([^<]*)<\/td>/',$grab,$matches);
  56.  
  57.     $st=array();
  58.     $st['code']=$code;
  59.     // Если получен какой-то результат
  60.     if (count($matches[1])) {
  61.         // Последнее действие
  62.         if ($matches[4][count($matches[1])-1]) {
  63.             $st['action']=$matches[4][count($matches[1])-1];
  64.         }
  65.         else {
  66.             $st['action']=$matches[1][count($matches[1])-1];
  67.         }
  68.         // Дата последнего действия
  69.         $st['date']=$matches[2][count($matches[1])-1];
  70.         // Местонахождение посылки
  71.         $st['where']=$matches[3][count($matches[1])-1];
  72.     }
  73.     // Ошибка на сервере или статус посылки еще не определен
  74.     else {
  75.         $st['action']='Неизвестно';
  76.         $st['date']='--';
  77.         $st['where']='--';
  78.     }
  79.  
  80.     // Записать результат в массив
  81.     $status[]=$st;
  82.  
  83.     curl_close($ch);
  84. }
  85. // Теперь в массиве $status содержится информация по всем посылкам
  86. var_dump($status);
  87. ?>
Настраивать скрипт очень легко. В массив $codes по аналогии добавляете трек-номера своих посылок. Поддерживаются коды Международной почты (Universal Post Union) и внутренние номера отслеживания почты России. После этого скрипт можно заливать на сервер. Хостинг, где будет размещен скрипт, должен поддерживать cURL и обращение к удаленным серверам, но даже на минимальных тарифах на платных хостингах обычно с этим никаких проблем нет. Единственное ограничение - время выполнения скрипта, при опросе статуса очень большого количества посылок он может отваливаться по лимиту времени, установленному на хостинговом сервере. На практике статусы двух десятков посылок опрашиваются около 10 секунд.

Читать статью целиком »
Просмотров: 10629 | Комментариев: 20

Функция для отображения размера файла

21.05.2012 | Категория: Web-мастеру и не только | Автор: ManHunter
Размер файлов в PHP измеряется в байтах, но числа из большого количества цифр для восприятия очень неудобны. На мой взгляд гораздо нагляднее, если размер больших файлов будет отображаться в килобайтах, мегабайтах и так далее. Для этого я нарисовал вот такую вспомогательную функцию:
  1. function bytes2words($size) {
  2.     for($i=0$i<count($st=array('Кб','Мб','Гб')); $i++) {
  3.         if (($size/=1024)<1024) { $i++; break; }
  4.     }
  5.     return round($size,2).' '.$st[($i-1)];
  6. }
Результаты работы функции:
  1. echo bytes2words(1000).'<br>';              // 0.98 Кб
  2. echo bytes2words(10000).'<br>';             // 9.77 Кб
  3. echo bytes2words(100000).'<br>';            // 97.66 Кб
  4. echo bytes2words(1000000).'<br>';           // 976.56 Кб
  5. echo bytes2words(10000000).'<br>';          // 9.54 Мб
  6. echo bytes2words(100000000).'<br>';         // 95.37 Мб
  7. echo bytes2words(1000000000).'<br>';        // 953.67 Мб
  8. echo bytes2words(10000000000).'<br>';       // 9.31 Гб
  9. echo bytes2words(100000000000).'<br>';      // 93.13 Гб
  10. echo bytes2words(1000000000000).'<br>';     // 931.32 Гб
  11. echo bytes2words(10000000000000).'<br>';    // 9313.23 Гб
  12. echo bytes2words(100000000000000).'<br>';   // 93132.26 Гб
На перспективу можно учесть и терабайты (например, если надо считать не размер файлов, а магистральный трафик в датацентре), для этого в массив наименований надо просто добавить элемент 'Тб'. Тестовый вывод, соответственно, изменится следующим образом:
  1. echo bytes2words(100000000000).'<br>';      // 93.13 Гб
  2. echo bytes2words(1000000000000).'<br>';     // 931.32 Гб
  3. echo bytes2words(10000000000000).'<br>';    // 9.09 Тб
  4. echo bytes2words(100000000000000).'<br>';   // 90.95 Тб
Вспоминается шутка 90-х годов: "Сколько будет дважды два? - А мы покупаем или продаем?". Размер килобайта в функции указан как положено - 1024 байта, все результаты, соответственно, получаются из этого расчета. Если надо считать так, как это делают некоторые особо умные провайдеры, то замените в функции все значения 1024 на 1000.

Просмотров: 4634 | Комментариев: 4

01 ... 13 14 15 16 17 18 19 ... 25
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 3 (0.0078 сек.) / Память: 4.5 Mb
Наверх