ROMaster2

Title coercion for cross database title matching

Mar 29th, 2022
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 9.59 KB | None | 0 0
  1. <?php
  2.     public static function sluggem()
  3.     {
  4.         $pdo = DB::getPdo();
  5.         $updater = $pdo->prepare('update xref.all_game_names set preslug = ?, slug = ?, extreme_slug = ? where id = ?');
  6.  
  7.         $names = DB::table('xref.all_game_names')->pluck('title', 'id')->all();
  8.  
  9.         foreach ($names as $id => $name)
  10.         {
  11.             $preslug = self::ultraSlug($name);
  12.  
  13.             $slug = substr(str_replace(' ', '', $preslug), 0, 159);
  14.  
  15.             $extremeSlug = substr($slug, 1); // Preserve the first character of the title.
  16.             $extremeSlug = str_replace('e', 'a', $extremeSlug); // Turn all vowels into on character.
  17.             $extremeSlug = str_replace('i', 'a', $extremeSlug);
  18.             $extremeSlug = str_replace('o', 'a', $extremeSlug);
  19.             $extremeSlug = str_replace('u', 'a', $extremeSlug);
  20.             $extremeSlug = str_replace('y', 'a', $extremeSlug);
  21.             $extremeSlug = str_replace('h', '', $extremeSlug); // "h" is often a padding character.
  22.             // "c" and "k" conflict sometimes. Arguably "s" and "z" can get involved but I didn't find that necessary.
  23.             $extremeSlug = str_replace('c', 'k', $extremeSlug);
  24.             $extremeSlug = substr($slug, 0, 1).$extremeSlug;
  25.             $extremeSlug = preg_replace('/aa+/', 'a', $extremeSlug);
  26.             $extremeSlug = preg_replace('/bb+/', 'b', $extremeSlug);
  27.             $extremeSlug = preg_replace('/dd+/', 'd', $extremeSlug);
  28.             $extremeSlug = preg_replace('/ff+/', 'f', $extremeSlug);
  29.             $extremeSlug = preg_replace('/gg+/', 'g', $extremeSlug);
  30.             $extremeSlug = preg_replace('/jj+/', 'j', $extremeSlug);
  31.             $extremeSlug = preg_replace('/kk+/', 'k', $extremeSlug);
  32.             $extremeSlug = preg_replace('/ll+/', 'l', $extremeSlug);
  33.             $extremeSlug = preg_replace('/mm+/', 'm', $extremeSlug);
  34.             $extremeSlug = preg_replace('/nn+/', 'n', $extremeSlug);
  35.             $extremeSlug = preg_replace('/pp+/', 'p', $extremeSlug);
  36.             $extremeSlug = preg_replace('/qq+/', 'q', $extremeSlug);
  37.             $extremeSlug = preg_replace('/rr+/', 'r', $extremeSlug);
  38.             $extremeSlug = preg_replace('/ss+/', 's', $extremeSlug);
  39.             $extremeSlug = preg_replace('/tt+/', 't', $extremeSlug);
  40.             $extremeSlug = preg_replace('/vv+/', 'v', $extremeSlug);
  41.             $extremeSlug = preg_replace('/ww+/', 'w', $extremeSlug);
  42.             $extremeSlug = preg_replace('/xx+/', 'x', $extremeSlug);
  43.             $extremeSlug = preg_replace('/zz+/', 'z', $extremeSlug);
  44.             $extremeSlug = str_replace('ex', 'x', $extremeSlug); // e.g. Extreme vs Xtreme
  45.             $extremeSlug = str_replace('ax', 'x', $extremeSlug);
  46.             $extremeSlug = substr($extremeSlug, 0, 127);
  47.  
  48.             $updater->execute([$preslug, $slug, $extremeSlug, $id]);
  49.         }
  50.     }
  51.  
  52.     public static function ultraSlug(string $title)
  53.     {
  54.         $title = self::slugger($title);
  55.         $title = Str::slug($title, ' ', 'en'); // Force any character that isn't a-z or " " into it.
  56.  
  57.         $title = str_replace(' n ', ' ', $title); // Easier to do it here than in slugger.
  58.         $title = str_replace('ou', 'o', $title); // Counters English spelling and Japanese romanization differences.
  59.         $title = str_replace('uu', 'u', $title);
  60.  
  61.         return substr($title, 0, 191);
  62.     }
  63.  
  64.     const ROMAN_NUMERALS = [
  65.         'II'    =>  '2', 'III'   =>  '3', 'IV'    =>  '4', 'V'     =>  '5', 'VI'    =>  '6', 'VII'   =>  '7',
  66.         'VIII'  =>  '8', 'IX'    =>  '9', 'XI'    => '11', 'XII'   => '12', 'XIII'  => '13', 'XIV'   => '14',
  67.         'XV'    => '15', 'XVI'   => '16', 'XVII'  => '17', 'XVIII' => '18', 'XIX'   => '19', 'XX'    => '20',
  68.     ];
  69.  
  70.     // "Second" can also mean time
  71.     const NUMBER_WORDS_SAFE = [
  72.         'first' => '1', 'third' => '3', 'fourth' => '4', 'fifth' => '5', 'sixth' => '6', 'seventh' => '7',
  73.         'eighth' => '8', 'ninth' => '9', 'tenth' => '10', 'eleventh' => '11', 'twelfth' => '12',
  74.         'five' => '5', 'six' => '6', 'seven' => '7', 'twelve' => '12',
  75.     ];
  76.  
  77.     const NUMBER_WORDS = [
  78.         'zero' => '0', 'one' => '1', 'two' => '2', 'three' => '3', 'four' => '4', 'six' => '6', 'eight' => '8',
  79.         'nine' => '9', 'ten' => '10', 'eleven' => '11',
  80.     ];
  81.  
  82.     const NUMBER_WORDS_OTHER = [
  83.         '0th' => '0', '1st' => '1', '1th' => '1', '2nd' => '2', '2th' => '2', '3rd' => '3', '3th' => '3', '4th' => '4',
  84.         '5th' => '5', '6th' => '6', '7th' => '7', '8th' => '8', '9th' => '9'
  85.     ];
  86.  
  87.     private static function slugger(string $title)
  88.     {
  89.         // X/10 is skipped since X can be used for 'edgier' titles, eg Mega Man X. V is much less common.
  90.         $title = preg_replace("/ and /ui", ' & ', $title);
  91.         $title = str_replace('_', ' ', $title);
  92.  
  93.         // "I" complicates things, as it can mean different things in different contexts.
  94.         // I regex'd a couple examples and these seem to make the most sense.
  95.         // Any other usage of \bI\b is usually not a roman numeric.
  96.         $title = preg_replace("/([^&]) I$/ui", '$1 1', $title);
  97.         $title = preg_replace("/([^&]) I, /ui", '$1 1, ', $title);
  98.         $title = preg_replace("/\. I$/ui", '. 1', $title);
  99.         $title = preg_replace("/ I ?: /ui", ' 1: ', $title);
  100.         $title = preg_replace("/ I & /ui", ' 1 & ', $title);
  101.         $title = preg_replace("/ I - /ui", ' 1 - ', $title);
  102.         foreach (self::ROMAN_NUMERALS as $romanNumeral => $number)
  103.             $title = preg_replace("/ I-$romanNumeral\b/ui", " 1-$number", $title);
  104.         $title = preg_replace('/ I\.([0-9]+)\b/ui', ' 1.$1', $title); // Thank you Kingdom Hearts...
  105.         $title = preg_replace('/ I·/ui', ' 1 ', $title);
  106.         $title = preg_replace('/ I•/ui', ' 1 ', $title);
  107.         $title = preg_replace('/ I! /ui', ' 1! ', $title);
  108.         $title = preg_replace('/ I\+/ui', ' 1+', $title);
  109.         $title = preg_replace('/ I \+ /ui', ' 1+', $title);
  110.  
  111.         // transliterator_transliterate() is part of the Intl extension.
  112.         // Coerce any non-latin1 characters into latin1.
  113.         // Would be great to have translated words be an option.
  114.         $title = transliterator_transliterate('Any-Latin; Latin-ASCII', $title);
  115.  
  116.         $titleBak = $title;
  117.  
  118.         foreach (self::ROMAN_NUMERALS as $romanNumeral => $number)
  119.             $title = preg_replace("/\b$romanNumeral(th)?\b/i", $number, $title);
  120.         foreach (self::NUMBER_WORDS_SAFE as $word => $number)
  121.             $title = str_replace($word, $number, $title);
  122.         foreach (self::NUMBER_WORDS as $word => $number)
  123.             $title = preg_replace("/\b$word\b/i", $number, $title);
  124.         foreach (self::NUMBER_WORDS_OTHER as $word => $number)
  125.             $title = preg_replace("/$word\b/i", $number, $title);
  126.  
  127.         // Because "V" is sometimes used instead of "verses"
  128.         $title = preg_replace("/\bverses\b/i", '5', $title);
  129.         $title = preg_replace("/\bv\.?s\b/i", '5', $title);
  130.  
  131.         if (preg_match('/\++$/', $title, $matches) !== 0)
  132.             $title = preg_replace('/\++$/', str_repeat(' plus', strlen($matches[0])), $title);
  133.  
  134.         $title = preg_replace("/\bBrother'?s\b/i", 'Bros', $title);
  135.  
  136.         $title = preg_replace("/\bVol(ume)?\b/i", '', $title);
  137.         $title = preg_replace("/\bP(ar)?t\b/i", '', $title);
  138.         $title = preg_replace("/\bEdition\b/i", '', $title);
  139.         $title = preg_replace("/\bVer(sion)?\b/i", '', $title);
  140.         $title = preg_replace("/\bChapter\b/i", '', $title);
  141.         $title = preg_replace("/\bCh(pt)?(\.| )/i", ' ', $title);
  142.         $title = preg_replace("/\bThe\b/i", '', $title);
  143.         $title = preg_replace("/\bAn? /i", ' ', $title);
  144.         $title = preg_replace("/-An?-/i", '-', $title);
  145.         $title = preg_replace("/\bin\b/i", '', $title);
  146.         $title = preg_replace("/\b1\/2\b/i", 'Half', $title); // Blame GiantBomb
  147.         $title = str_ireplace(' no ', ' ', $title); // Japanese titles
  148.         $title = str_replace('&', '', $title);
  149.         $title = str_replace('@', 'a', $title);
  150.         $title = str_replace('+', '', $title);
  151.         $title = preg_replace("/ 1$/", '', $title);
  152.  
  153.         // Titles with "'s" in them cause nothing but issues. These are some of the most common ones.
  154.         $title = preg_replace("/\bWalt Disney'?s?\b/i", '', $title);
  155.         $title = preg_replace("/\bDisney'?s?\b/i", '', $title);
  156.         $title = preg_replace("/\bPixar'?s?\b/i", '', $title);
  157.         $title = preg_replace("/\bDisney/Pixar'?s?\b/i", '', $title);
  158.         $title = preg_replace("/\bDream.?works'?s?\b/i", '', $title);
  159.         $title = preg_replace("/\bTom Clancy'?s?\b/i", '', $title);
  160.         $title = preg_replace("/\bSid Meier'?s?\b/i", '', $title);
  161.         $title = preg_replace("/\bDr.?.?Kawashima'?s?\b/i", '', $title);
  162.         $title = preg_replace("/\bPeter Jackson'?s?\b/i", '', $title);
  163.         $title = preg_replace("/\bDavid Crane'?s?\b/i", '', $title);
  164.         $title = preg_replace("/\bJames Cameron'?s?\b/i", '', $title);
  165.         $title = preg_replace("/\bMichael Jackson'?s?\b/i", '', $title);
  166.         $title = preg_replace("/\bTim Burton'?s?\b/i", '', $title);
  167.         $title = preg_replace("/\bJohn Romero'?s?\b/i", '', $title);
  168.         $title = preg_replace("/\bJ.?R.?R.? ?Tolkien'?s?\b/i", '', $title);
  169.         $title = preg_replace("/\bTodd McFarlane'?s?\b/i", '', $title);
  170.         $title = preg_replace("/\bLemony Snicket'?s?\b/i", '', $title);
  171.         $title = preg_replace("/\bJim Henson'?s?\b/i", '', $title);
  172.  
  173.         $title = preg_replace("/ \(video game\)$/i", '', $title);
  174.  
  175.         if ($title === '')
  176.             $title = $titleBak;
  177.  
  178.         return $title;
  179.     }
  180.  
Add Comment
Please, Sign In to add comment