Skip to content

Instantly share code, notes, and snippets.

@mac2000
Created January 15, 2014 10:39
Show Gist options
  • Save mac2000/8434152 to your computer and use it in GitHub Desktop.
Save mac2000/8434152 to your computer and use it in GitHub Desktop.
Speed tests for different slugify methods
<?php
class PregReplaceSlugify
{
public $rules = array(
'/º|°/' => 0,
'/¹/' => 1,
'/²/' => 2,
'/³/' => 3,
'/æ|ǽ|ä/' => 'ae',
'/œ|ö/' => 'oe',
'/À|Á|Â|Ã|Å|Ǻ|Ā|Ă|Ą|Ǎ|А/' => 'A',
'/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª|а/' => 'a',
'/@/' => 'at',
'/Б/' => 'B',
'/б/' => 'b',
'/Ç|Ć|Ĉ|Ċ|Č|Ц/' => 'C',
'/ç|ć|ĉ|ċ|č|ц/' => 'c',
'/Ð|Ď|Đ|Д/' => 'Dj',
'/ð|ď|đ|д/' => 'dj',
'/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě|Е|Ё|Э/' => 'E',
'/è|é|ê|ë|ē|ĕ|ė|ę|ě|е|ё|э/' => 'e',
'/Ф/' => 'F',
'/ƒ|ф/' => 'f',
'/Ĝ|Ğ|Ġ|Ģ|Г|Ґ/' => 'G',
'/ĝ|ğ|ġ|ģ|г|ґ/' => 'g',
'/Ĥ|Ħ|Х/' => 'H',
'/ĥ|ħ|х/' => 'h',
'/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ|И|І/' => 'I',
'/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı|и|і/' => 'i',
'/Ĵ|Й/' => 'J',
'/ĵ|й/' => 'j',
'/Ķ|К/' => 'K',
'/ķ|к/' => 'k',
'/Ĺ|Ļ|Ľ|Ŀ|Ł|Л/' => 'L',
'/ĺ|ļ|ľ|ŀ|ł|л/' => 'l',
'/М/' => 'M',
'/м/' => 'm',
'/Ñ|Ń|Ņ|Ň|Н/' => 'N',
'/ñ|ń|ņ|ň|ʼn|н/' => 'n',
'/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ|О/' => 'O',
'/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º|о/' => 'o',
'/П/' => 'P',
'/п/' => 'p',
'/Ŕ|Ŗ|Ř|Р/' => 'R',
'/ŕ|ŗ|ř|р/' => 'r',
'/Ś|Ŝ|Ş|Ș|Š|С/' => 'S',
'/ś|ŝ|ş|ș|š|ſ|с/' => 's',
'/Ţ|Ț|Ť|Ŧ|Т/' => 'T',
'/ţ|ț|ť|ŧ|т/' => 't',
'/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ|У/' => 'U',
'/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ|у/' => 'u',
'/ü/' => 'ue',
'/Ü/' => 'UE',
'/В/' => 'V',
'/в/' => 'v',
'/Ý|Ÿ|Ŷ|Ы/' => 'Y',
'/ý|ÿ|ŷ|ы/' => 'y',
'/Ŵ/' => 'W',
'/ŵ/' => 'w',
'/Ź|Ż|Ž|З/' => 'Z',
'/ź|ż|ž|з/' => 'z',
'/Æ|Ǽ|Ä/' => 'AE',
'/ß/' => 'ss',
'/IJ/' => 'IJ',
'/ij/' => 'ij',
'/Œ|Ö/' => 'OE',
'/Ч/' => 'Ch',
'/ч/' => 'ch',
'/Ю/' => 'Ju',
'/ю/' => 'ju',
'/Я/' => 'Ja',
'/я/' => 'ja',
'/Ш/' => 'Sh',
'/ш/' => 'sh',
'/Щ/' => 'Shch',
'/щ/' => 'shch',
'/Ж/' => 'Zh',
'/ж/' => 'zh',
'/ї/' => 'ji',
'/Ї/' => 'Ji',
);
public function replace($string, $separator = '-')
{
$string = preg_replace(array_keys($this->rules), array_values($this->rules), $string);
$string = preg_replace('/([^a-z0-9]|-)+/usi', $separator, $string);
$string = strtolower($string);
return trim($string, $separator);
}
}
class StrTrSlugify
{
public $rules = array(
'º'=>0,
'°'=>0,
'¹'=>1,
'²'=>2,
'³'=>3,
'æ'=>'ae',
'ǽ'=>'ae',
'ä'=>'ae',
'œ'=>'oe',
'ö'=>'oe',
'À'=>'A',
'Á'=>'A',
'Â'=>'A',
'Ã'=>'A',
'Å'=>'A',
'Ǻ'=>'A',
'Ā'=>'A',
'Ă'=>'A',
'Ą'=>'A',
'Ǎ'=>'A',
'А'=>'A',
'à'=>'a',
'á'=>'a',
'â'=>'a',
'ã'=>'a',
'å'=>'a',
'ǻ'=>'a',
'ā'=>'a',
'ă'=>'a',
'ą'=>'a',
'ǎ'=>'a',
'ª'=>'a',
'а'=>'a',
'@'=>'at',
'Б'=>'B',
'б'=>'b',
'Ç'=>'C',
'Ć'=>'C',
'Ĉ'=>'C',
'Ċ'=>'C',
'Č'=>'C',
'Ц'=>'C',
'ç'=>'c',
'ć'=>'c',
'ĉ'=>'c',
'ċ'=>'c',
'č'=>'c',
'ц'=>'c',
'Ð'=>'Dj',
'Ď'=>'Dj',
'Đ'=>'Dj',
'Д'=>'Dj',
'ð'=>'dj',
'ď'=>'dj',
'đ'=>'dj',
'д'=>'dj',
'È'=>'E',
'É'=>'E',
'Ê'=>'E',
'Ë'=>'E',
'Ē'=>'E',
'Ĕ'=>'E',
'Ė'=>'E',
'Ę'=>'E',
'Ě'=>'E',
'Е'=>'E',
'Ё'=>'E',
'Э'=>'E',
'è'=>'e',
'é'=>'e',
'ê'=>'e',
'ë'=>'e',
'ē'=>'e',
'ĕ'=>'e',
'ė'=>'e',
'ę'=>'e',
'ě'=>'e',
'е'=>'e',
'ё'=>'e',
'э'=>'e',
'Ф'=>'F',
'ƒ'=>'f',
'ф'=>'f',
'Ĝ'=>'G',
'Ğ'=>'G',
'Ġ'=>'G',
'Ģ'=>'G',
'Г'=>'G',
'Ґ'=>'G',
'ĝ'=>'g',
'ğ'=>'g',
'ġ'=>'g',
'ģ'=>'g',
'г'=>'g',
'ґ'=>'g',
'Ĥ'=>'H',
'Ħ'=>'H',
'Х'=>'H',
'ĥ'=>'h',
'ħ'=>'h',
'х'=>'h',
'Ì'=>'I',
'Í'=>'I',
'Î'=>'I',
'Ï'=>'I',
'Ĩ'=>'I',
'Ī'=>'I',
'Ĭ'=>'I',
'Ǐ'=>'I',
'Į'=>'I',
'İ'=>'I',
'И'=>'I',
'І'=>'I',
'ì'=>'i',
'í'=>'i',
'î'=>'i',
'ï'=>'i',
'ĩ'=>'i',
'ī'=>'i',
'ĭ'=>'i',
'ǐ'=>'i',
'į'=>'i',
'ı'=>'i',
'и'=>'i',
'і'=>'i',
'Ĵ'=>'J',
'Й'=>'J',
'ĵ'=>'j',
'й'=>'j',
'Ķ'=>'K',
'К'=>'K',
'ķ'=>'k',
'к'=>'k',
'Ĺ'=>'L',
'Ļ'=>'L',
'Ľ'=>'L',
'Ŀ'=>'L',
'Ł'=>'L',
'Л'=>'L',
'ĺ'=>'l',
'ļ'=>'l',
'ľ'=>'l',
'ŀ'=>'l',
'ł'=>'l',
'л'=>'l',
'М'=>'M',
'м'=>'m',
'Ñ'=>'N',
'Ń'=>'N',
'Ņ'=>'N',
'Ň'=>'N',
'Н'=>'N',
'ñ'=>'n',
'ń'=>'n',
'ņ'=>'n',
'ň'=>'n',
'ʼn'=>'n',
'н'=>'n',
'Ò'=>'O',
'Ó'=>'O',
'Ô'=>'O',
'Õ'=>'O',
'Ō'=>'O',
'Ŏ'=>'O',
'Ǒ'=>'O',
'Ő'=>'O',
'Ơ'=>'O',
'Ø'=>'O',
'Ǿ'=>'O',
'О'=>'O',
'ò'=>'o',
'ó'=>'o',
'ô'=>'o',
'õ'=>'o',
'ō'=>'o',
'ŏ'=>'o',
'ǒ'=>'o',
'ő'=>'o',
'ơ'=>'o',
'ø'=>'o',
'ǿ'=>'o',
'º'=>'o',
'о'=>'o',
'П'=>'P',
'п'=>'p',
'Ŕ'=>'R',
'Ŗ'=>'R',
'Ř'=>'R',
'Р'=>'R',
'ŕ'=>'r',
'ŗ'=>'r',
'ř'=>'r',
'р'=>'r',
'Ś'=>'S',
'Ŝ'=>'S',
'Ş'=>'S',
'Ș'=>'S',
'Š'=>'S',
'С'=>'S',
'ś'=>'s',
'ŝ'=>'s',
'ş'=>'s',
'ș'=>'s',
'š'=>'s',
'ſ'=>'s',
'с'=>'s',
'Ţ'=>'T',
'Ț'=>'T',
'Ť'=>'T',
'Ŧ'=>'T',
'Т'=>'T',
'ţ'=>'t',
'ț'=>'t',
'ť'=>'t',
'ŧ'=>'t',
'т'=>'t',
'Ù'=>'U',
'Ú'=>'U',
'Û'=>'U',
'Ũ'=>'U',
'Ū'=>'U',
'Ŭ'=>'U',
'Ů'=>'U',
'Ű'=>'U',
'Ų'=>'U',
'Ư'=>'U',
'Ǔ'=>'U',
'Ǖ'=>'U',
'Ǘ'=>'U',
'Ǚ'=>'U',
'Ǜ'=>'U',
'У'=>'U',
'ù'=>'u',
'ú'=>'u',
'û'=>'u',
'ũ'=>'u',
'ū'=>'u',
'ŭ'=>'u',
'ů'=>'u',
'ű'=>'u',
'ų'=>'u',
'ư'=>'u',
'ǔ'=>'u',
'ǖ'=>'u',
'ǘ'=>'u',
'ǚ'=>'u',
'ǜ'=>'u',
'у'=>'u',
'ü'=>'ue',
'Ü'=>'UE',
'В'=>'V',
'в'=>'v',
'Ý'=>'Y',
'Ÿ'=>'Y',
'Ŷ'=>'Y',
'Ы'=>'Y',
'ý'=>'y',
'ÿ'=>'y',
'ŷ'=>'y',
'ы'=>'y',
'Ŵ'=>'W',
'ŵ'=>'w',
'Ź'=>'Z',
'Ż'=>'Z',
'Ž'=>'Z',
'З'=>'Z',
'ź'=>'z',
'ż'=>'z',
'ž'=>'z',
'з'=>'z',
'Æ'=>'AE',
'Ǽ'=>'AE',
'Ä'=>'AE',
'ß'=>'ss',
'IJ'=>'IJ',
'ij'=>'ij',
'Œ'=>'OE',
'Ö'=>'OE',
'Ч'=>'Ch',
'ч'=>'ch',
'Ю'=>'Ju',
'ю'=>'ju',
'Я'=>'Ja',
'я'=>'ja',
'Ш'=>'Sh',
'ш'=>'sh',
'Щ'=>'Shch',
'щ'=>'shch',
'Ж'=>'Zh',
'ж'=>'zh',
'ї'=>'ji',
'Ї'=>'Ji',
);
public function replace($string, $separator = '-')
{
$string = strtolower(strtr($string, $this->rules));
$string = preg_replace('/([^a-z0-9]|-)+/usi', $separator, $string);
$string = strtolower($string);
return trim($string, $separator);
}
}
class TransliterateSlugify {
public $rules = 'Any-Latin; Latin-ASCII; NFD; NFC; Lower();';
public function replace($string, $separator = '-')
{
$string = transliterator_transliterate($this->rules, $string);
$string = preg_replace('/([^a-z0-9]|-)+/usi', $separator, $string);
return trim($string, $separator);
}
}
function test($o) {
$data = array(
array('Hello', 'hello'),
array('Hello World', 'hello-world'),
array('Привет мир', 'privet-mir'),
array('Привіт світ', 'privit-svit'),
array('Hello: World', 'hello-world'),
array('H+e#l1l--o/W§o r.l:d)', 'h-e-l1l-o-w-o-r-l-d'),
array(': World', 'world'),
array('Hello World!', 'hello-world'),
array('Ä ä Ö ö Ü ü ß', 'ae-ae-oe-oe-ue-ue-ss'),
array('Á À á à É È é è Ó Ò ó ò Ñ ñ Ú Ù ú ù', 'a-a-a-a-e-e-e-e-o-o-o-o-n-n-u-u-u-u'),
array('Â â Ê ê Ô ô Û û', 'a-a-e-e-o-o-u-u'),
array('Â â Ê ê Ô ô Û 1', 'a-a-e-e-o-o-u-1'),
array('°¹²³@','0123at'),
array('Mórë thån wørds', 'more-than-words'),
array('Блоґ їжачка', 'blog-izacka'),
array('Lorem ipsum dolor sit amet, consectetur adipisicing elit. Officia magni distinctio quasi doloribus mollitia aut atque pariatur nobis. Quos, eveniet a harum sit ipsam quibusdam iusto sapiente at quia maxime.', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Officia magni distinctio quasi doloribus mollitia aut atque pariatur nobis. Quos, eveniet a harum sit ipsam quibusdam iusto sapiente at quia maxime.')
);
$before = microtime(true);
for($i=0; $i<1000;$i++) {
foreach($data as $item) {
$o->replace($item[0]);
}
}
$after = microtime(true);
echo sprintf(
'%20s: %.4f sec' . PHP_EOL,
get_class($o),
($after-$before)/$i
);
}
test(new PregReplaceSlugify());
test(new StrTrSlugify());
test(new TransliterateSlugify());
// PregReplaceSlugify: 0.0052 sec
// StrTrSlugify: 0.0021 sec
//TransliterateSlugify: 0.0031 sec
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment