<?php
error_reporting(-1);

function match($mask, $name) {
	if (empty($mask) and empty($name)) {
		return true;
	} elseif (!empty($mask) and !empty($name)) {
		//	var_dump($mask, $name);
		//	echo "\n";
		$pattern = mb_substr($mask, 0, 1);
		$tested = mb_substr($name, 0, 1);
		//	var_dump($pattern, $tested);
		//	echo "\n\n";
		if ($tested == $pattern or $pattern == "?") {
			return match(mb_substr($mask, 1), mb_substr($name, 1)); 
		} elseif ($pattern == "*") {
			$maskTail = mb_substr($mask, 1);
			for ($nameTail = $name; mb_strlen($nameTail) > 0; $nameTail = mb_substr($nameTail, 1)) {
				//var_dump ($maskTail, $nameTail);
				//	echo "\n";
				if (match($maskTail, $nameTail)) {
					return true;
					break;
				}
			}
			
		} else {
			return false;
		}
		
		
	}  else {
		return false;
	}
	
	
}

$tests = [   /*маска, имя, результат*/
			["mask", "name", false],
			["mask", "mask", true],
			["test?", "test1", true],
			["?test?", "1test3", true],
			["??es?t?", "1tes2t3", true],
			["?22??33", "1224433", true],
			["t*t", "test", true],
			["t*t", "test1", false],
			["т*т?1", "те*?т21", true],
			["*.txt", "book.txt", true],
			["harry?.avi", "harry3.avi", true]
		  
		];

for ($i=0; count($tests) > $i; $i++) {
	$a = (string) $tests[$i][2];
	echo "сравниваем ( {$tests[$i][0]} и {$tests[$i][1]} ) ожидаем увидеть: $a \n";
	if (match($tests[$i][0], $tests[$i][1]) == $tests[$i][2]) {
		echo "подошло\n";
	} else {
		echo "!!АЛЯРМ!! не подошло!! СБОЙ ПРОГРАММЫ\n";
	}
	echo "\n";
}		
		
		
		