Для этого применяется стандартная функция trim(). Однако есть разновидность "сложных" пробелов, которые возникают при UTF-кодировке:


// превратим HTML с неразрывными пробелами в "обычную" строку
$myHTML = " abc"; 
$converted = strtr($myHTML, array_flip(get_html_translation_table(HTML_ENTITIES, ENT_QUOTES)));

// нижеследующая инструкция не работает, как ожидается 
// $converted превратится в " abc" в исходном коде
$converted = trim($converted); 

//   превращается в 0xA0 в обычном случае, тогда можно попробовать: 
$converted = trim($converted, "\xA0"); // <- что не всегда срабатывает 

// UTF кодирует его в chr(0xC2).chr(0xA0) 
$converted = trim($converted,chr(0xC2).chr(0xA0)); // у меня работает 

Нашел полезный PHP-скрипт для обнаружения потенциально вредоносных скриптов, также написанных на PHP. Суть работы сводится к поиску вхождений base64_decode, HTTP_REFERER, файлов, названия которых начинаются с точки (так они скрываются от FTP-менеджеров). Можно взять здесь https://aw-snap.info/articles/base64-decode.php либо вот ниже:

<html><head><title>Find String</title></head><body>
<?php
// ini_set('max_execution_time', '0');
// ini_set('set_time_limit', '0');
find_files('.');
function find_files($seed) {
  if(! is_dir($seed)) return false;
  $files = array();
  $dirs = array($seed);
  while(NULL !== ($dir = array_pop($dirs)))
    {
      if($dh = opendir($dir))
        {
          while( false !== ($file = readdir($dh)))
            {
              if($file == '.' || $file == '..') continue;
              $path = $dir . '/' . $file;
              if(is_dir($path)) { $dirs[] = $path; }
              else { if(preg_match('/^.*\.(php[\d]?|txt|js|htaccess)$/i', $path)) { check_files($path); }}
            }
          closedir($dh);
        }
    }
}

function check_files($this_file){
  $str_to_find[]='base64_decode';
  $str_to_find[]='edoced_46esab'; // base64_decode reversed
  $str_to_find[]='preg_replace';
  $str_to_find[]='HTTP_REFERER';
  $str_to_find[]='HTTP_USER_AGENT';

  if(!($content = file_get_contents($this_file)))
    { echo("<p>Could not check $this_file You should check the contents manually!</p>\n"); }
    else
      {
        while(list(,$value)=each($str_to_find))
          {
            if (stripos($content, $value) !== false)
              {
                echo("<p>$this_file -> contains $value</p>\n");
              }
            }
          }
        unset($content);
}
?>
</body></html>

Сделал заказчику поисковик по недвижке на IPS4 и Pages. Одной из последних задач была необходимость сконвертировать select-элементы с множественным выбором в набор checkbox'ов. С этой задачей отменно справился легковесный jQuery-плагин Multicheckbox.

На планшетах и телефонах может съезжать затемнение (overlay) в галерее prettyPhoto, а картинка центрироваться не по ширине экрана. Я предполагаю, что это связано с масштабированием сайта на мобильных устройствах и некорректным расчетом ширины области просмотра (viewport).

Это не всестороннее решение проблемы, а быстрое - чтоб вот прям вот уже сейчас, чтоб не вылезало красным предупреждение и разрешенная длина поля была хотя бы 255:

идем в modules/system/system.module, находим что-то типа:

$types['textfield'] = array(
    '#input' => TRUE,
    '#size' => 60,
    '#maxlength' => 128,

и меняем на:

$types['textfield'] = array(
    '#input' => TRUE,
    '#size' => 60,
    '#maxlength' => 255,

Одной строкой на PHP можно найти индекс у элемента массива $array, который содержит максимальное (или минимальное) значение:

$max = array_keys($array, max($array))[0];

Заменив функцию max() на min(), получим минимальное значение.

Написал простую библиотеку для реализации корзины товаров на сайте, хранящейся в сессии. Она состоит из двух классов: объекта корзины (что-то типа пачки или палета из одного товара или нескольких таких же) и собственно корзины. Скачать zip-архивом.

Сама библиотека - cart.php:

Самодостаточная библиотека Requests призвана восполнить недостаток в человеческих инструментах PHP для отправки HTTP-запросов. Авторы правильно посчитали, что у всех нас полно других интересных вещей, нежели разборки с занятным API cURL, все опции и параметры которого просто невозможно держать в голове. Да и не всегда cURL доступен. Cокеты обеспечивают лишь низкоуровневый доступ и требуют от программиста парсить все ответы HTTP самостоятельно.

Наверх