<?php
    error_reporting(-1);
    mb_internal_encoding('utf-8');
    
    function doOneStep($mask, $filename, $symbol)
    {
        if ((mb_strlen($mask) == 0) && (mb_strlen($filename) == 0)) {
            return true;
        }
        
        $lMask = mb_substr($mask, 0, 1);
        $lFilename = mb_substr($filename, 0, 1);
        
        /** 
         *   Если в маске символ "?", а длина имени файла равна нулю -> проиграли,
         *   если больше нуля, то убираем один символ из имени файла 
         */
        if ($lMask == '?') {
            if (mb_strlen($filename) > 0) {
                return doOneStep(mb_substr($mask, 1), mb_substr($filename, 1), $lMask);
            } else {
                return false;
            }
        }
        
        if ($lMask == '*') {
            return doOneStep(mb_substr($mask, 1), $filename, $lMask);
        }
        
        /** 
         *   Если символ маски и имени файла совпадают -> убираем по симовлу
         *   иначе, если пред. символ '*' и длина имени файла != 0 -> убираем символ имени файла 
         */        
        if ($lMask == $lFilename) {
            return doOneStep(mb_substr($mask, 1), mb_substr($filename, 1), $symbol);
        } else {
            if (mb_strlen($filename) > 0 && $symbol == '*') {
                return doOneStep($mask, mb_substr($filename, 1), $symbol);
            } else {
                return false;
            }
        }
    }
    
    $mask = 'test';
    $filename = 't';
    $test = array(
        'mask' => array('test', 'test', 'test', 'te?t', 'te?t', 'te?t', 'te?t', 't???', 't???', 't*', 't*', 't*', '*t' , '*t***t*', '*t***t*', 't*st', '*t*st', '', '', 't', '*'),
        'filename' => array('test', 'test.txt', 't', 'test', 'tesst', 'tet', 'te?t', 'test', 't', 'test', 't', 'rest', 'rest', 'test', 'rest', 'teskest', 'teskest', '', 't', '', ''),
        'answer' => array('+', '-', '-', '+', '-', '-', '+', '+', '-', '+', '+', '-', '+', '+', '-', '+', '+', '+', '-', '-', '+')
    );
    
    function addSpaceCenter($text, $length)
    {
        if (mb_strlen($text) < $length) {
            $text = str_repeat(' ', round(($length - mb_strlen($text)) / 2)) . $text . str_repeat(' ', floor(($length - mb_strlen($text)) / 2));
        }
        return $text;
    }
    
    function addDash($width, $cols) {
        echo str_repeat('-', $width*$cols + $cols) . "\n";
    }
    
    $countTest = count($test['mask']);
    
    $width = 15;
    echo addSpaceCenter('Имя файла', $width). "|" . addSpaceCenter('Маска', $width) . "|" . addSpaceCenter('Результат', $width) . "" . addSpaceCenter('Правильный ответ', $width) . "|\n";
    addDash($width, 4);
    for ($i = 0; $i < $countTest; $i++) {
        $answer = doOneStep($test['mask'][$i], $test['filename'][$i], '') ? "+" : "-";
        echo addSpaceCenter($test['filename'][$i], $width) . "|" . addSpaceCenter($test['mask'][$i], $width) . "|" . addSpaceCenter($answer, $width) . "|" . addSpaceCenter($test['answer'][$i], $width) . "|\n";
        addDash($width, 4);
    }
    
    
?>