fork(1) download
  1. <?php
  2.  
  3. function match($mask, $name) {
  4. if (empty($mask) and empty($name)) {
  5. return true;
  6. } elseif (!empty($mask) and !empty($name)) {
  7. // var_dump($mask, $name);
  8. // echo "\n";
  9. $pattern = mb_substr($mask, 0, 1);
  10. $tested = mb_substr($name, 0, 1);
  11. // var_dump($pattern, $tested);
  12. // echo "\n\n";
  13. if ($tested == $pattern or $pattern == "?") {
  14. return match(mb_substr($mask, 1), mb_substr($name, 1));
  15. } elseif ($pattern == "*") {
  16. $maskTail = mb_substr($mask, 1);
  17. for ($nameTail = $name; mb_strlen($nameTail) > 0; $nameTail = mb_substr($nameTail, 1)) {
  18. //var_dump ($maskTail, $nameTail);
  19. // echo "\n";
  20. if (match($maskTail, $nameTail)) {
  21. return true;
  22. break;
  23. }
  24. }
  25.  
  26. } else {
  27. return false;
  28. }
  29.  
  30.  
  31. } else {
  32. return false;
  33. }
  34.  
  35.  
  36. }
  37.  
  38. $tests = [ /*маска, имя, результат*/
  39. ["mask", "name", false],
  40. ["mask", "mask", true],
  41. ["test?", "test1", true],
  42. ["?test?", "1test3", true],
  43. ["??es?t?", "1tes2t3", true],
  44. ["?22??33", "1224433", true],
  45. ["t*t", "test", true],
  46. ["t*t", "test1", false],
  47. ["т*т?1", "те*?т21", true],
  48. ["*.txt", "book.txt", true],
  49. ["harry?.avi", "harry3.avi", true]
  50.  
  51. ];
  52.  
  53. for ($i=0; count($tests) > $i; $i++) {
  54. $a = (string) $tests[$i][2];
  55. echo "сравниваем ( {$tests[$i][0]} и {$tests[$i][1]} ) ожидаем увидеть: $a \n";
  56. if (match($tests[$i][0], $tests[$i][1]) == $tests[$i][2]) {
  57. echo "подошло\n";
  58. } else {
  59. echo "!!АЛЯРМ!! не подошло!! СБОЙ ПРОГРАММЫ\n";
  60. }
  61. echo "\n";
  62. }
  63.  
  64.  
  65.  
Success #stdin #stdout 0.02s 24400KB
stdin
Standard input is empty
stdout
сравниваем ( mask и name ) ожидаем увидеть:  
подошло

сравниваем ( mask и mask ) ожидаем увидеть: 1 
подошло

сравниваем ( test? и test1 ) ожидаем увидеть: 1 
подошло

сравниваем ( ?test? и 1test3 ) ожидаем увидеть: 1 
подошло

сравниваем ( ??es?t? и 1tes2t3 ) ожидаем увидеть: 1 
подошло

сравниваем ( ?22??33 и 1224433 ) ожидаем увидеть: 1 
подошло

сравниваем ( t*t и test ) ожидаем увидеть: 1 
подошло

сравниваем ( t*t и test1 ) ожидаем увидеть:  
подошло

сравниваем ( т*т?1 и те*?т21 ) ожидаем увидеть: 1 
подошло

сравниваем ( *.txt и book.txt ) ожидаем увидеть: 1 
подошло

сравниваем ( harry?.avi и harry3.avi ) ожидаем увидеть: 1 
подошло