PluginProbe
MaxButtons – Create buttons / 6.27
MaxButtons – Create buttons v6.27
6.23 6.24 6.25 6.26 6.26.1 6.27 6.28 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7.0 7.1 7.1.1 7.1.2 7.1.3 7.10 7.11 7.13 7.13.1 7.13.2 7.13.3 All 100 releases
maxbuttons / assets / libraries / url_slug.php

url_slug.php in MaxButtons – Create buttons 6.27, at assets/libraries/url_slug.php

130 lines 5.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Create a web friendly URL slug from a string.
4 *
5 * Although supported, transliteration is discouraged because
6 * 1) most web browsers support UTF-8 characters in URLs
7 * 2) transliteration causes a loss of information
8 *
9 * @author Sean Murphy <sean@iamseanmurphy.com>
10 * @copyright Copyright 2012 Sean Murphy. All rights reserved.
11 * @license http://creativecommons.org/publicdomain/zero/1.0/
12 *
13 * @param string $str
14 * @param array $options
15 * @return string
16 */
17 function mb_url_slug($str, $options = array()) {
18 if (! function_exists('mb_convert_encoding') || ! function_exists('mb_list_encodings') )
19 return $str;
20
21 // Make sure string is in UTF-8 and strip invalid UTF-8 characters
22 $str = mb_convert_encoding((string)$str, 'UTF-8', mb_list_encodings());
23
24 $defaults = array(
25 'delimiter' => '-',
26 'limit' => null,
27 'lowercase' => true,
28 'replacements' => array(),
29 'transliterate' => false,
30 );
31
32 // Merge options
33 $options = array_merge($defaults, $options);
34
35 $char_map = array(
36 // Latin
37 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A', '�
38 ' => 'A', 'Æ' => 'AE', 'Ç' => 'C',
39 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I',
40 'Ð' => 'D', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ö' => 'O', 'Ő' => 'O',
41 'Ø' => 'O', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U', 'Ű' => 'U', 'Ý' => 'Y', 'Þ' => 'TH',
42 'ß' => 'ss',
43 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'a', 'å' => 'a', 'æ' => 'ae', 'ç' => 'c',
44 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i',
45 'ð' => 'd', 'ñ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 'ő' => 'o',
46 'ø' => 'o', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'u', 'ű' => 'u', 'ý' => 'y', 'þ' => 'th',
47 'ÿ' => 'y',
48
49 // Latin symbols
50 '©' => '(c)',
51
52 // Greek
53 'Α' => 'A', 'Β' => 'B', 'Γ' => 'G', 'Δ' => 'D', 'Ε' => 'E', 'Ζ' => 'Z', 'Η' => 'H', 'Θ' => '8',
54 'Ι' => 'I', 'Κ' => 'K', 'Λ' => 'L', 'Μ' => 'M', 'Ν' => 'N', 'Ξ' => '3', 'Ο' => 'O', 'Π' => 'P',
55 'Ρ' => 'R', 'Σ' => 'S', 'Τ' => 'T', 'Υ' => 'Y', 'Φ' => 'F', 'Χ' => 'X', 'Ψ' => 'PS', 'Ω' => 'W',
56 'Ά' => 'A', 'Έ' => 'E', 'Ί' => 'I', 'Ό' => 'O', 'Ύ' => 'Y', 'Ή' => 'H', 'Ώ' => 'W', 'Ϊ' => 'I',
57 'Ϋ' => 'Y',
58 'α' => 'a', 'β' => 'b', 'γ' => 'g', 'δ' => 'd', 'ε' => 'e', 'ζ' => 'z', 'η' => 'h', 'θ' => '8',
59 'ι' => 'i', 'κ' => 'k', 'λ' => 'l', 'μ' => 'm', 'ν' => 'n', 'ξ' => '3', 'ο' => 'o', 'π' => 'p',
60 'ρ' => 'r', 'σ' => 's', 'τ' => 't', '�
61 ' => 'y', 'φ' => 'f', 'χ' => 'x', 'ψ' => 'ps', 'ω' => 'w',
62 'ά' => 'a', 'έ' => 'e', 'ί' => 'i', 'ό' => 'o', 'ύ' => 'y', 'ή' => 'h', 'ώ' => 'w', 'ς' => 's',
63 'ϊ' => 'i', 'ΰ' => 'y', 'ϋ' => 'y', 'ΐ' => 'i',
64
65 // Turkish
66 'Ş' => 'S', 'İ' => 'I', 'Ç' => 'C', 'Ü' => 'U', 'Ö' => 'O', 'Ğ' => 'G',
67 'ş' => 's', 'ı' => 'i', 'ç' => 'c', 'ü' => 'u', 'ö' => 'o', 'ğ' => 'g',
68
69 // Russian
70 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'Yo', 'Ж' => 'Zh',
71 'З' => 'Z', 'И' => 'I', 'Й' => 'J', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O',
72 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C',
73 'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sh', 'Ъ' => '', 'Ы' => 'Y', 'Ь' => '', 'Э' => 'E', 'Ю' => 'Yu',
74 'Я' => 'Ya',
75 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'yo', 'ж' => 'zh',
76 'з' => 'z', 'и' => 'i', 'й' => 'j', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o',
77 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', '�
78 ' => 'h', 'ц' => 'c',
79 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sh', 'ъ' => '', 'ы' => 'y', 'ь' => '', 'э' => 'e', 'ю' => 'yu',
80 'я' => 'ya',
81
82 // Ukrainian
83 'Є' => 'Ye', 'І' => 'I', 'Ї' => 'Yi', 'Ґ' => 'G',
84 'є' => 'ye', 'і' => 'i', 'ї' => 'yi', 'ґ' => 'g',
85
86 // Czech
87 'Č' => 'C', 'Ď' => 'D', 'Ě' => 'E', 'Ň' => 'N', 'Ř' => 'R', 'Š' => 'S', 'Ť' => 'T', 'Ů' => 'U',
88 'Ž' => 'Z',
89 'č' => 'c', 'ď' => 'd', 'ě' => 'e', 'ň' => 'n', 'ř' => 'r', 'š' => 's', 'ť' => 't', 'ů' => 'u',
90 'ž' => 'z',
91
92 // Polish
93 'Ą' => 'A', 'Ć' => 'C', 'Ę' => 'e', 'Ł' => 'L', 'Ń' => 'N', 'Ó' => 'o', 'Ś' => 'S', 'Ź' => 'Z',
94 'Ż' => 'Z',
95 '�
96 ' => 'a', 'ć' => 'c', 'ę' => 'e', 'ł' => 'l', 'ń' => 'n', 'ó' => 'o', 'ś' => 's', 'ź' => 'z',
97 'ż' => 'z',
98
99 // Latvian
100 'Ā' => 'A', 'Č' => 'C', 'Ē' => 'E', 'Ģ' => 'G', 'Ī' => 'i', 'Ķ' => 'k', 'Ļ' => 'L', '�
101 ' => 'N',
102 'Š' => 'S', 'Ū' => 'u', 'Ž' => 'Z',
103 'ā' => 'a', 'č' => 'c', 'ē' => 'e', 'ģ' => 'g', 'ī' => 'i', 'ķ' => 'k', 'ļ' => 'l', 'ņ' => 'n',
104 'š' => 's', 'ū' => 'u', 'ž' => 'z'
105 );
106
107 // Make custom replacements
108 $str = preg_replace(array_keys($options['replacements']), $options['replacements'], $str);
109
110 // Transliterate characters to ASCII
111 if ($options['transliterate']) {
112 $str = str_replace(array_keys($char_map), $char_map, $str);
113 }
114
115 // Replace non-alphanumeric characters with our delimiter
116 $str = preg_replace('/[^\p{L}\p{Nd}]+/u', $options['delimiter'], $str);
117
118 // Remove duplicate delimiters
119 $str = preg_replace('/(' . preg_quote($options['delimiter'], '/') . '){2,}/', '$1', $str);
120
121 // Truncate slug to max. characters
122 $str = mb_substr($str, 0, ($options['limit'] ? $options['limit'] : mb_strlen($str, 'UTF-8')), 'UTF-8');
123
124 // Remove delimiter from ends
125 $str = trim($str, $options['delimiter']);
126
127 return $options['lowercase'] ? mb_strtolower($str, 'UTF-8') : $str;
128 }
129 ?>
130