PHP регулярные выражения: разбиение на слова для любого языка

Достаточно долго в моих проектах разбиение на слова делалось очень простой регуляркой:

preg_match_all("|([A-Za-zА-Яа-я0-9]+)|u", $str, $words);

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

preg_match_all('/([\pL0-9]+)/u', $str, $words);

jScroll. Бесконечная прокрутка без особых проблем и дружественная к поисковикам

Итак, заказчик попросил на сайте, где уже была сделана традиционная пагинация, сделать т.н. бесконечную прокрутку — т.е. чтоб при скроллинге до конца страницы подгружались данные со следующих страниц. Ничего сложного, но переписывать код было лень. И тут на помощь пришёл скриптик jScroll
Continue reading ‘jScroll. Бесконечная прокрутка без особых проблем и дружественная к поисковикам’ »

Русская дата (с месяцами)

Не помню, откуда стащил, но эта функция бывает очень полезна:

function russian_date($d){
    $date=explode(".", date("d.m.Y", $d));
    switch ($date[1]){
        case 1: $m='января'; break;
        case 2: $m='февраля'; break;
        case 3: $m='марта'; break;
        case 4: $m='апреля'; break;
        case 5: $m='мая'; break;
        case 6: $m='июня'; break;
        case 7: $m='июля'; break;
        case 8: $m='августа'; break;
        case 9: $m='сентября'; break;
        case 10: $m='октября'; break;
        case 11: $m='ноября'; break;
        case 12: $m='декабря'; break;
    }
    return $date[0].' '.$m.' '.$date[2] . " г.";
}

Прекрасная функция рекурсивного удаления директорий

Алгоритм не сложный, но так не хочется каждый раз его сочинять 🙂

function RemoveDir($path, $del_root = true)
{
	if(file_exists($path) && is_dir($path))
	{
		$dirHandle = opendir($path);
		while (false !== ($file = readdir($dirHandle))) 
		{
			if ($file!='.' && $file!='..')// исключаем папки с назварием '.' и '..' 
			{
				$tmpPath=$path.'/'.$file;
				chmod($tmpPath, 0777);
				
				if (is_dir($tmpPath))
	  		{  // если папка
					RemoveDir($tmpPath);
			  } 
	  		else 
	  			{ 
	  				if(file_exists($tmpPath))
					  {
						  // удаляем файл 
	  					unlink($tmpPath);
					   }
	  			}
			}
		}
		closedir($dirHandle);
		
		// удаляем текущую папку
		if(file_exists($path) && $del_root)
		{
			rmdir($path);
		}
	}
	else
	{
		return 0;
	}
}

Масштабирование изображения под максимальный размер

Полезный алгоритм, из тех, которые лучше знать. Итак, задача: есть изображение (потенциально — большое), есть максимальная высота и ширина. Надо уменьшить изображение пропорционально так, чтобы оно влезло в эти максимальные пределы.

function getNewSize($size, $maxX, $maxY) {
  $k = $maxX / $maxY;
  $kimage = $size[0] / $size[1];
  if ($kimage > $k) { //resize of maxX
    $ksize = $maxX /$size[0];
  } else { //resize of maxY
    $ksize = $maxY / $size[1];
  }
  $newX = floor($size[0] * $ksize);
  $newY = floor($size[1] * $ksize);

  /* image resize */

  return [$newX, $newY];
}

Спасибо romach с форума php.ru

Когда Kohana ORM может навредить или преимущество группирующих запросов SQL

Итак, после долгого перерыва я снова готов написать статью. Перерыв был по весьма уважительной причине — делал свой первый относительно крупный проект на Kohana Framework. И естественно, для базы данных я использовал ORM. Эта статья — о ловушках, в которые я с ним попал.
Continue reading ‘Когда Kohana ORM может навредить или преимущество группирующих запросов SQL’ »

Вывод соседних записей рубрики

Итак, заказчиком поставлена была следующая задача: выводить к каждой записи 4 её «соседей» — ближайшие записи, созданные раньше и позже пользователем. Типа это улучшит индексацию сайта, и создаст дополнительное удобство пользователям. Причём, записи по возможности надо выводить — 2 добавленные ранее, и две добавленные после, чтоб название текущей оказалось в середине. Ну что просили, то мы и сделали 🙂
Continue reading ‘Вывод соседних записей рубрики’ »

Альтернативные макеты и пункты меню в Joomla 2.5

Начиная с Joomla 1.6 появилась возможность для любого компонента делать альтернативные макеты. Это достаточно подробно рассматривается во многих источниках в Интернете, поэтому часть проблемы я рассмотрю обобщённо, и уделю больше внимание тому, что вызвало трудности у меня при работе с альтернативными макетами. Как обычно и делается, для примера мы возмём компонент com_content. К примеру, нам надо сделать альтернативный макет конкретной статьи. Для этого в каталоге своего шаблона создаются ряд вложенных каталогов, чтоб в итоге получилось html/com_content/article. Узнать имя папки просто. Для этого достаточно посмотреть каталог /components/com_content/views.
Continue reading ‘Альтернативные макеты и пункты меню в Joomla 2.5’ »

Получение списка файлов, отсортированных по дате

Ну здесь, я думаю, всё ясно из заголовка. Скрипт стащил отсюда.

function listdir_by_date($path){
    $dir = opendir($path);
    $list = array();
    while($file = readdir($dir)){
        if ($file != '.' and $file != '..'){
            // кроме даты создания файлы добавляем ещё и имя
            // чтобы удостоверится, что мы не заменяем ключ массива
            $ctime = filectime($path . $file) . ',' . $file;
            $list[$ctime] = $file;
        }
    }
    closedir($dir);
    krsort($list);
    return $list;
}

Слайдер carouFredSel. Использование произвольных элементов управления

Недавно передо мной была поставлена задача сверстать дизайн, где на главной странице было целых три слайдера, у всех совершенно разное оформление кнопок «Вперёд» и «Назад». Естественно, мне не хотелось искать три разных скрипта. Немного поискав в интернете, я нашёл почти идеальный скрипт под эту задачу: этот jQuery carouFredSel 6.2.1
Continue reading ‘Слайдер carouFredSel. Использование произвольных элементов управления’ »