Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- public static function sluggem()
- {
- $pdo = DB::getPdo();
- $updater = $pdo->prepare('update xref.all_game_names set preslug = ?, slug = ?, extreme_slug = ? where id = ?');
- $names = DB::table('xref.all_game_names')->pluck('title', 'id')->all();
- foreach ($names as $id => $name)
- {
- $preslug = self::ultraSlug($name);
- $slug = substr(str_replace(' ', '', $preslug), 0, 159);
- $extremeSlug = substr($slug, 1); // Preserve the first character of the title.
- $extremeSlug = str_replace('e', 'a', $extremeSlug); // Turn all vowels into on character.
- $extremeSlug = str_replace('i', 'a', $extremeSlug);
- $extremeSlug = str_replace('o', 'a', $extremeSlug);
- $extremeSlug = str_replace('u', 'a', $extremeSlug);
- $extremeSlug = str_replace('y', 'a', $extremeSlug);
- $extremeSlug = str_replace('h', '', $extremeSlug); // "h" is often a padding character.
- // "c" and "k" conflict sometimes. Arguably "s" and "z" can get involved but I didn't find that necessary.
- $extremeSlug = str_replace('c', 'k', $extremeSlug);
- $extremeSlug = substr($slug, 0, 1).$extremeSlug;
- $extremeSlug = preg_replace('/aa+/', 'a', $extremeSlug);
- $extremeSlug = preg_replace('/bb+/', 'b', $extremeSlug);
- $extremeSlug = preg_replace('/dd+/', 'd', $extremeSlug);
- $extremeSlug = preg_replace('/ff+/', 'f', $extremeSlug);
- $extremeSlug = preg_replace('/gg+/', 'g', $extremeSlug);
- $extremeSlug = preg_replace('/jj+/', 'j', $extremeSlug);
- $extremeSlug = preg_replace('/kk+/', 'k', $extremeSlug);
- $extremeSlug = preg_replace('/ll+/', 'l', $extremeSlug);
- $extremeSlug = preg_replace('/mm+/', 'm', $extremeSlug);
- $extremeSlug = preg_replace('/nn+/', 'n', $extremeSlug);
- $extremeSlug = preg_replace('/pp+/', 'p', $extremeSlug);
- $extremeSlug = preg_replace('/qq+/', 'q', $extremeSlug);
- $extremeSlug = preg_replace('/rr+/', 'r', $extremeSlug);
- $extremeSlug = preg_replace('/ss+/', 's', $extremeSlug);
- $extremeSlug = preg_replace('/tt+/', 't', $extremeSlug);
- $extremeSlug = preg_replace('/vv+/', 'v', $extremeSlug);
- $extremeSlug = preg_replace('/ww+/', 'w', $extremeSlug);
- $extremeSlug = preg_replace('/xx+/', 'x', $extremeSlug);
- $extremeSlug = preg_replace('/zz+/', 'z', $extremeSlug);
- $extremeSlug = str_replace('ex', 'x', $extremeSlug); // e.g. Extreme vs Xtreme
- $extremeSlug = str_replace('ax', 'x', $extremeSlug);
- $extremeSlug = substr($extremeSlug, 0, 127);
- $updater->execute([$preslug, $slug, $extremeSlug, $id]);
- }
- }
- public static function ultraSlug(string $title)
- {
- $title = self::slugger($title);
- $title = Str::slug($title, ' ', 'en'); // Force any character that isn't a-z or " " into it.
- $title = str_replace(' n ', ' ', $title); // Easier to do it here than in slugger.
- $title = str_replace('ou', 'o', $title); // Counters English spelling and Japanese romanization differences.
- $title = str_replace('uu', 'u', $title);
- return substr($title, 0, 191);
- }
- const ROMAN_NUMERALS = [
- 'II' => '2', 'III' => '3', 'IV' => '4', 'V' => '5', 'VI' => '6', 'VII' => '7',
- 'VIII' => '8', 'IX' => '9', 'XI' => '11', 'XII' => '12', 'XIII' => '13', 'XIV' => '14',
- 'XV' => '15', 'XVI' => '16', 'XVII' => '17', 'XVIII' => '18', 'XIX' => '19', 'XX' => '20',
- ];
- // "Second" can also mean time
- const NUMBER_WORDS_SAFE = [
- 'first' => '1', 'third' => '3', 'fourth' => '4', 'fifth' => '5', 'sixth' => '6', 'seventh' => '7',
- 'eighth' => '8', 'ninth' => '9', 'tenth' => '10', 'eleventh' => '11', 'twelfth' => '12',
- 'five' => '5', 'six' => '6', 'seven' => '7', 'twelve' => '12',
- ];
- const NUMBER_WORDS = [
- 'zero' => '0', 'one' => '1', 'two' => '2', 'three' => '3', 'four' => '4', 'six' => '6', 'eight' => '8',
- 'nine' => '9', 'ten' => '10', 'eleven' => '11',
- ];
- const NUMBER_WORDS_OTHER = [
- '0th' => '0', '1st' => '1', '1th' => '1', '2nd' => '2', '2th' => '2', '3rd' => '3', '3th' => '3', '4th' => '4',
- '5th' => '5', '6th' => '6', '7th' => '7', '8th' => '8', '9th' => '9'
- ];
- private static function slugger(string $title)
- {
- // X/10 is skipped since X can be used for 'edgier' titles, eg Mega Man X. V is much less common.
- $title = preg_replace("/ and /ui", ' & ', $title);
- $title = str_replace('_', ' ', $title);
- // "I" complicates things, as it can mean different things in different contexts.
- // I regex'd a couple examples and these seem to make the most sense.
- // Any other usage of \bI\b is usually not a roman numeric.
- $title = preg_replace("/([^&]) I$/ui", '$1 1', $title);
- $title = preg_replace("/([^&]) I, /ui", '$1 1, ', $title);
- $title = preg_replace("/\. I$/ui", '. 1', $title);
- $title = preg_replace("/ I ?: /ui", ' 1: ', $title);
- $title = preg_replace("/ I & /ui", ' 1 & ', $title);
- $title = preg_replace("/ I - /ui", ' 1 - ', $title);
- foreach (self::ROMAN_NUMERALS as $romanNumeral => $number)
- $title = preg_replace("/ I-$romanNumeral\b/ui", " 1-$number", $title);
- $title = preg_replace('/ I\.([0-9]+)\b/ui', ' 1.$1', $title); // Thank you Kingdom Hearts...
- $title = preg_replace('/ I·/ui', ' 1 ', $title);
- $title = preg_replace('/ I•/ui', ' 1 ', $title);
- $title = preg_replace('/ I! /ui', ' 1! ', $title);
- $title = preg_replace('/ I\+/ui', ' 1+', $title);
- $title = preg_replace('/ I \+ /ui', ' 1+', $title);
- // transliterator_transliterate() is part of the Intl extension.
- // Coerce any non-latin1 characters into latin1.
- // Would be great to have translated words be an option.
- $title = transliterator_transliterate('Any-Latin; Latin-ASCII', $title);
- $titleBak = $title;
- foreach (self::ROMAN_NUMERALS as $romanNumeral => $number)
- $title = preg_replace("/\b$romanNumeral(th)?\b/i", $number, $title);
- foreach (self::NUMBER_WORDS_SAFE as $word => $number)
- $title = str_replace($word, $number, $title);
- foreach (self::NUMBER_WORDS as $word => $number)
- $title = preg_replace("/\b$word\b/i", $number, $title);
- foreach (self::NUMBER_WORDS_OTHER as $word => $number)
- $title = preg_replace("/$word\b/i", $number, $title);
- // Because "V" is sometimes used instead of "verses"
- $title = preg_replace("/\bverses\b/i", '5', $title);
- $title = preg_replace("/\bv\.?s\b/i", '5', $title);
- if (preg_match('/\++$/', $title, $matches) !== 0)
- $title = preg_replace('/\++$/', str_repeat(' plus', strlen($matches[0])), $title);
- $title = preg_replace("/\bBrother'?s\b/i", 'Bros', $title);
- $title = preg_replace("/\bVol(ume)?\b/i", '', $title);
- $title = preg_replace("/\bP(ar)?t\b/i", '', $title);
- $title = preg_replace("/\bEdition\b/i", '', $title);
- $title = preg_replace("/\bVer(sion)?\b/i", '', $title);
- $title = preg_replace("/\bChapter\b/i", '', $title);
- $title = preg_replace("/\bCh(pt)?(\.| )/i", ' ', $title);
- $title = preg_replace("/\bThe\b/i", '', $title);
- $title = preg_replace("/\bAn? /i", ' ', $title);
- $title = preg_replace("/-An?-/i", '-', $title);
- $title = preg_replace("/\bin\b/i", '', $title);
- $title = preg_replace("/\b1\/2\b/i", 'Half', $title); // Blame GiantBomb
- $title = str_ireplace(' no ', ' ', $title); // Japanese titles
- $title = str_replace('&', '', $title);
- $title = str_replace('@', 'a', $title);
- $title = str_replace('+', '', $title);
- $title = preg_replace("/ 1$/", '', $title);
- // Titles with "'s" in them cause nothing but issues. These are some of the most common ones.
- $title = preg_replace("/\bWalt Disney'?s?\b/i", '', $title);
- $title = preg_replace("/\bDisney'?s?\b/i", '', $title);
- $title = preg_replace("/\bPixar'?s?\b/i", '', $title);
- $title = preg_replace("/\bDisney/Pixar'?s?\b/i", '', $title);
- $title = preg_replace("/\bDream.?works'?s?\b/i", '', $title);
- $title = preg_replace("/\bTom Clancy'?s?\b/i", '', $title);
- $title = preg_replace("/\bSid Meier'?s?\b/i", '', $title);
- $title = preg_replace("/\bDr.?.?Kawashima'?s?\b/i", '', $title);
- $title = preg_replace("/\bPeter Jackson'?s?\b/i", '', $title);
- $title = preg_replace("/\bDavid Crane'?s?\b/i", '', $title);
- $title = preg_replace("/\bJames Cameron'?s?\b/i", '', $title);
- $title = preg_replace("/\bMichael Jackson'?s?\b/i", '', $title);
- $title = preg_replace("/\bTim Burton'?s?\b/i", '', $title);
- $title = preg_replace("/\bJohn Romero'?s?\b/i", '', $title);
- $title = preg_replace("/\bJ.?R.?R.? ?Tolkien'?s?\b/i", '', $title);
- $title = preg_replace("/\bTodd McFarlane'?s?\b/i", '', $title);
- $title = preg_replace("/\bLemony Snicket'?s?\b/i", '', $title);
- $title = preg_replace("/\bJim Henson'?s?\b/i", '', $title);
- $title = preg_replace("/ \(video game\)$/i", '', $title);
- if ($title === '')
- $title = $titleBak;
- return $title;
- }
Add Comment
Please, Sign In to add comment