После прочтения предыдуших топиков про капчу, мне пришла идея сделать ребус капчу. Конечно, использовать её в реальных проектах не очень правильно, так как пользователь будет тратить время на решение ребуса, а вы наверное знаете, как иногда раздражает даже обычные буквы с капчи ввести.


Ребус


Ребус включает в себя всего лишь одну методику, когда часть слова представлена в виде изображения с опреденным количеством обрезаных букв в начале или в конце. Для того, что бы одно изображение имело несколько варинтов, используется следующая структура файловой системы:
 images/
        |                    
        +--+[image_name]/+
        |                +-+[image_type_1]   
        |                |
        |                +-+[image_type_2]   
        |                |
        |                +-+...
        |                |
        |                +-+[image_type_n]   
        |
        |
        |
        |   
        +--+[image_name]/+
                         +-+[image_type_1]
                         |
                         +-+[image_type_2]
                         |
                         +-+...
                         |
                         +-+[image_type_n]

Например при составлении ребуса из слова «stream», программа нашла совпадение букв (частей слова) с изображением «heart», то используемое изображение будет выбрано случайным образом из папки "/images/heart/".

Поиск совпадений


Поиск совпадений работает следующим образом: перебор частей загаданного слово, и поиск на совпдение со словами, которые представлены изображениями. Загаданное слово, например habrahabr, делиться на части следующим образом:
habrahabr
habrahab
abrahabr
habraha
abrahab
brahabr
habrah
abraha
brahab
rahabr
habra
abrah
braha
rahab
ahabr
habr
abra
brah
raha
ahab
habr
hab
abr
bra
rah
aha
hab
abr
ha

Пои��к происходит до первого совпадения, после чего выделяются левая и правая часть слова от совпавшей, для которых так же применяется поиск.

Использование


$rebus = new rebus('path/to/image/folder');

Передаваемый параметр — путь к папке с изображениями, структура которой должна быть как описывалось выше.
Настройки:
  • captchaWordsArray — массив слов, для составления ребуса
  • backgroundColor — Array(r,g,b). По умолчанию — черный
  • textColor — Array(r,g,b). По умолчанию — черный
  • fontSize — размер шрифта. По умолчанию — 60px
  • width — ширина ребуса. По умолчанию — 300px
  • padding — внутренний отступ. По умолчанию — 10px
  • font — используемый шрифт
  • imagesHeight — высота копируемого изображения в ребус
  • imagesWidth — ширина копируемого изображения в ребус
  • cache — кеширование. По умолчанию — false
  • rebusCacheFolder — папка для хранения кеша.


Генерация изображения:

$rebus->getImage($flag);

  • $flag — усли установлен — то происходит вывод изобрежения. Если нет — функция возвращает GD ресурс. По умолчанию — true;


Полный код:

<?php 

session_start();

include 'rebus.class.php';

$rebus = new rebus('images');

$rebus->captchaWordsArray = Array(
	'tar',
	'swap',
	'sic',
	'threat',
	'bow',
	'stream',
	'steam',
	'google',
	'comet',
	'comet',
	'hot',
	'wool',
	'hell',
	'twitter',
	'chat',
	'habrahabr',
	'warlock',
	'fold',
	'soft',
	'ripper',
	'apple'
	);


$rebus->getImage();


Предыдущие топики про капчу:

Для написания топика использовал: Редактор таблиц данных из ASCII-графики

Исходник можно скачать тут.
Пример можно посмотреть тут.