Спасибо огромное, тема решина, оставляю самые необходиме функции тут для распознания текста с картинки, сорри что код без коментов Всем огромное спасибо! И особое спасибо для 4upakabr0 =) PHP: function cmp($n, $a, $b) { $f=0; $i=0; $sizeB=count($b); foreach($a as $k=>$v) { if($sizeB<=$i) { return 1; } if($k==$n) { $f=1; } if($f) { if($v!=$b[$i]) { return 0; } $i++; } } return 1; } $im = imagecreatefrompng("captcha.png"); $tmp = imagecreate (imagesx($im), imagesy($im)); imagealphablending($tmp, false); imagesavealpha($tmp, true); imagecopyresampled($tmp, $im, 0, 0, 0, 0, imagesx($im), imagesy($im), imagesx($im), imagesy($im)); $imagex =imagesx($tmp); $imagey =imagesy($tmp); for ($x = 0; $x < $imagex; $x++) { for ($y = 0; $y < $imagey; $y++) { $i = imagecolorat ($tmp, $x, $y); $old=ImageColorsForIndex($tmp,$i); $r = (int)($old['red'] + $old['green'] + $old['blue'])/3; if ($r != 128) { ImageColorSet($tmp,$i,255,255,255); $img_arr[$x][$y] = 1; } else { $img_arr[$x][$y] = 0; } } } for ($x = 0; $x < $imagex; $x++) { for ($y = 0; $y < $imagey; $y++) { if ($img_arr[$x][$y] == 0) {$res[$x].= 1;} //else {$res[$x].= 0;} } } foreach ($mask as $m => $mask_value) { $i=0; foreach ($res as $ind => $val) { if($mask[$m][0] === $val ) { if(cmp($ind, $res, $mask[$m])) { $rrr[$ind] = $m; } } $i++; } } f полезная статья по php + GD ТУТ
Алгоритм очевиден. Положим массив А - это массив с данными, массив В - шаблон. - Перебираешь каждую строку А и сравниваешь с первой строкой В. - Если совпадение, то запускаешь детальное сравнение от текущей строкии в А под номером N до N+(длинна В), если всё прошло без запинки, то запоминаешь N - отсюда у нас найден шаблон. - Далее, если найден шаблон и тебе не ныжны пересекающиеся множества строк шаблонов, то прыгаешь дальше на длинну массива В, иначе просто берешь вторую строку чот мне делать нехер стало, вот накидал код: PHP: <?php // !!! берём за условие, что индексы в массиве-маске идут последовательно и начинаются с 0 !!! $mask[1] = array( "11", "11", "1111111111", "11111111111", "111111111111", "11", "11", ); //здесь нам срать на идексы, т.к. фореач $result[16] = '11'; $result[17] = '111'; $result[18] = '111'; $result[19] = '111'; $result[20] = '111'; $result[21] = '111'; $result[22] = '111'; $result[23] = '111'; $result[24] = '1111111'; $result[25] = '111111'; $result[26] = '111'; $result[32] = '1'; $result[33] = '11'; $result[34] = '11'; $result[35] = '11'; $result[36] = '11'; $result[37] = '11'; $result[38] = '11'; $result[39] = '111111111'; $result[40] = '1111111111'; $result[41] = '111111111'; $result[42] = '1'; $result[47] = '11'; //тот самый кусок $result[48] = '11' ;//тот самый кусок $result[49] = '1111111111'; $result[50] = '11111111111'; //тот самый кусок $result[51] = '111111111111'; //тот самый кусок $result[52] = '11'; //тот самый кусок $result[53] = '11' ;//тот самый кусок $result[57] = '111111'; $result[58] = '11111111'; $result[63] = '1'; $result[64] = '111111111'; $result[65] = '1111111' ; $i=0; foreach ($result as $ind => $val) { if($mask[1][0] === $val ) { if(cmp($ind, $result, $mask[1])) print "since line number $i with key $ind in array 'result' next ".count($mask[1])." lines matched with array 'mask[1] !"; } $i++; } function cmp($n, $a, $b) { $f=0; $i=0; $sizeB=count($b); foreach($a as $k=>$v) { if($sizeB<=$i) { return 1; } if($k==$n) { $f=1; } if($f) { if($v!=$b[$i]) { return 0; } $i++; } } return 1; } ?> у тебя в исходных данных ошибки были, я чуть подправил массивы. алгоритм рабочий. находит все совпадения с перекрытиями.
Romaxa55 взять шаблоны и исходные данные, преобразовать в строки через implode с символом, который не встречается, а дальше strpos. Будет работать стабильнее, чем большинство из того, что вы сможете написать.