modify (simplify) topic title for displaying in url
I am creating a small message board in PHP and I need to "simplify" the topic title to display it in the url of the topic.
Examples:
Ceci e开发者_StackOverflow社区st un sujet d'exemple
becomes ceci-est-un-sujet-d-exemple
J'ai été à la plage
becomes j-ai-ete-a-la-plage
I dislike sp&cial character$
becomes i-dislike-spcial-character
(if there is a better translation, i take it)
EDIT 1 : All strings must be UTF-8 encoded
EDIT 2 : I recently learned that the result of this type of operation is called "slug" or "friendly url"
Here's what I've done. I think I've covered most of the "common" characters. Obviously, it's going to be missing some however.
/**
* Replaces special characters in a string with their "non-special" counterpart.
*
* Useful for friendly URLs.
*
* @param string
* @return string
*/
function convertAccentsAndSpecialToNormal($string) {
$table = array(
'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A', 'Ă'=>'A', 'Ā'=>'A', 'Ą'=>'A', 'Æ'=>'A', 'Ǽ'=>'A',
'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a', 'ă'=>'a', 'ā'=>'a', 'ą'=>'a', 'æ'=>'a', 'ǽ'=>'a',
'Þ'=>'B', 'þ'=>'b', 'ß'=>'Ss',
'Ç'=>'C', 'Č'=>'C', 'Ć'=>'C', 'Ĉ'=>'C', 'Ċ'=>'C',
'ç'=>'c', 'č'=>'c', 'ć'=>'c', 'ĉ'=>'c', 'ċ'=>'c',
'Đ'=>'Dj', 'Ď'=>'D', 'Đ'=>'D',
'đ'=>'dj', 'ď'=>'d',
'È'=>'E', 'É'=>'E', 'Ê'=>'E', 'Ë'=>'E', 'Ĕ'=>'E', 'Ē'=>'E', 'Ę'=>'E', 'Ė'=>'E',
'è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e', 'ĕ'=>'e', 'ē'=>'e', 'ę'=>'e', 'ė'=>'e',
'Ĝ'=>'G', 'Ğ'=>'G', 'Ġ'=>'G', 'Ģ'=>'G',
'ĝ'=>'g', 'ğ'=>'g', 'ġ'=>'g', 'ģ'=>'g',
'Ĥ'=>'H', 'Ħ'=>'H',
'ĥ'=>'h', 'ħ'=>'h',
'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I', 'İ'=>'I', 'Ĩ'=>'I', 'Ī'=>'I', 'Ĭ'=>'I', 'Į'=>'I',
'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'į'=>'i', 'ĩ'=>'i', 'ī'=>'i', 'ĭ'=>'i', 'ı'=>'i',
'Ĵ'=>'J',
'ĵ'=>'j',
'Ķ'=>'K',
'ķ'=>'k', 'ĸ'=>'k',
'Ĺ'=>'L', 'Ļ'=>'L', 'Ľ'=>'L', 'Ŀ'=>'L', 'Ł'=>'L',
'ĺ'=>'l', 'ļ'=>'l', 'ľ'=>'l', 'ŀ'=>'l', 'ł'=>'l',
'Ñ'=>'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',
'Ŕ'=>'R', 'Ř'=>'R',
'ŕ'=>'r', 'ř'=>'r', 'ŗ'=>'r',
'Š'=>'S', 'Ŝ'=>'S', 'Ś'=>'S', 'Ş'=>'S',
'š'=>'s', 'ŝ'=>'s', 'ś'=>'s', 'ş'=>'s',
'Ŧ'=>'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',
'Ŵ'=>'W', 'Ẁ'=>'W', 'Ẃ'=>'W', 'Ẅ'=>'W',
'ŵ'=>'w', 'ẁ'=>'w', 'ẃ'=>'w', 'ẅ'=>'w',
'Ý'=>'Y', 'Ÿ'=>'Y', 'Ŷ'=>'Y',
'ý'=>'y', 'ÿ'=>'y', 'ŷ'=>'y',
'Ž'=>'Z', 'Ź'=>'Z', 'Ż'=>'Z', 'Ž'=>'Z',
'ž'=>'z', 'ź'=>'z', 'ż'=>'z', 'ž'=>'z',
'“'=>'"', '”'=>'"', '‘'=>"'", '’'=>"'", '•'=>'-', '…'=>'...', '—'=>'-', '–'=>'-', '¿'=>'?', '¡'=>'!', '°'=>' degrees ',
'¼'=>' 1/4 ', '½'=>' 1/2 ', '¾'=>' 3/4 ', '⅓'=>' 1/3 ', '⅔'=>' 2/3 ', '⅛'=>' 1/8 ', '⅜'=>' 3/8 ', '⅝'=>' 5/8 ', '⅞'=>' 7/8 ',
'÷'=>' divided by ', '×'=>' times ', '±'=>' plus-minus ', '√'=>' square root ', '∞'=>' infinity ',
'≈'=>' almost equal to ', '≠'=>' not equal to ', '≡'=>' identical to ', '≤'=>' less than or equal to ', '≥'=>' greater than or equal to ',
'←'=>' left ', '→'=>' right ', '↑'=>' up ', '↓'=>' down ', '↔'=>' left and right ', '↕'=>' up and down ',
'℅'=>' care of ', '℮' => ' estimated ',
'Ω'=>' ohm ',
'♀'=>' female ', '♂'=>' male ',
'©'=>' Copyright ', '®'=>' Registered ', '™' =>' Trademark ',
);
$string = strtr($string, $table);
// Currency symbols: £¤¥€ - we dont bother with them for now
$string = preg_replace("/[^\x9\xA\xD\x20-\x7F]/u", "", $string);
return $string;
}
/**
* Create URL Title
*
* Takes a "title" string as input and creates a human-friendly URL string.
*
* @param string
* @param boolean
* @return string
*/
if (!function_exists('friendlyUrl')) {
function friendlyUrl($string, $lowercase = TRUE) {
$separator = '-';
if (function_exists('convertAccentsAndSpecialToNormal')) {
$string = convertAccentsAndSpecialToNormal($string);
}
$trans = array(
'/&\#\d+?;/i' => '',
'/&\S+?;/i' => '',
'/\.+/i' => '',
'/\s+/' => $separator,
'/\/+/' => $separator,
'/[^a-z0-9\-\._]/i' => '',
'/'. $separator .'+/' => $separator,
'/'. $separator .'$/' => $separator,
'/^'. $separator .'/' => $separator,
'/\.+$/' => ''
);
$string = strip_tags($string);
$string = preg_replace(array_keys($trans), array_values($trans), $string);
if ($lowercase === TRUE) {
$string = strtolower($string);
}
return trim(stripslashes($string));
}
}
$title = "what&v3r y0^7 t1#le is"; // Input string
$title = preg_replace( "/[^a-zA-Z0-9\s]/", "", $title ); // Removes all non alpha-numeric characters and spaces
$title = strtolower( $title ); // Makes the string lowercase
$title = preg_replace( "/\s/", "-", $title ); // Replaces the space character with a dash.
echo $title; // outputs: whatv3r-y07-t1le-is
You can try iconv() with ASCII//TRANSLIT
as output characterset.
The final solution, created from your answers:
function simplifierTitre($str) {
$table = array(
'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'a', 'å' => 'a',
'ă' => 'a', 'ā' => 'a', 'ą' => 'a', 'æ' => 'a', 'ǽ' => 'a', 'þ' => 'b',
'ç' => 'c', 'č' => 'c', 'ć' => 'c', 'ĉ' => 'c', 'ċ' => 'c', 'ż' => 'z',
'đ' => 'd', 'ď' => 'd', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e',
'ĕ' => 'e', 'ē' => 'e', 'ę' => 'e', 'ė' => 'e', 'ĝ' => 'g', 'ğ' => 'g',
'ġ' => 'g', 'ģ' => 'g', 'ĥ' => 'h', 'ħ' => 'h', 'ì' => 'i', 'í' => 'i',
'î' => 'i', 'ï' => 'i', 'į' => 'i', 'ĩ' => 'i', 'ī' => 'i', 'ĭ' => 'i',
'ı' => 'i', 'ĵ' => 'j', 'ķ' => 'k', 'ĸ' => 'k', 'ĺ' => 'l', 'ļ' => 'l',
'ľ' => 'l', 'ŀ' => 'l', 'ł' => 'l', 'ñ' => 'n', 'ń' => 'n', 'ň' => 'n',
'ņ' => 'n', 'ŋ' => 'n', 'ʼn' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o',
'õ' => 'o', 'ö' => 'o', 'ø' => 'o', 'ō' => 'o', 'ŏ' => 'o', 'ő' => 'o',
'œ' => 'o', 'ð' => 'o', 'ŕ' => 'r', 'ř' => 'r', 'ŗ' => 'r', 'š' => 's',
'ŝ' => 's', 'ś' => 's', 'ş' => 's', 'ŧ' => 't', 'ţ' => 't', 'ť' => 't',
'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'u', 'ũ' => 'u', 'ū' => 'u',
'ŭ' => 'u', 'ů' => 'u', 'ű' => 'u', 'ų' => 'u', 'ŵ' => 'w', 'ẁ' => 'w',
'ẃ' => 'w', 'ẅ' => 'w', 'ý' => 'y', 'ÿ' => 'y', 'ŷ' => 'y', 'ž' => 'z',
'ź' => 'z',
);
// We don't deal with uppercase characters
$str = mb_strtolower($str);
// Strip accents
$str = strtr($str, $table);
// Non-alphanumericals characters become spaces
$str = preg_replace('/[^a-z0-9]/', ' ', $str);
// Remove trailing and ending spaces
$str = trim($str);
// Spaces become -
$str = preg_replace('#\s+#', '-', $str);
return $str;
}
You can use a smaller array :
$table = array(
'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'a',
'ç' => 'c', 'è' => 'e', 'ê' => 'e', 'ë' => 'e', 'ì' => 'i',
'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ñ' => 'n', 'ò' => 'o',
'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 'ù' => 'u',
'ú' => 'u', 'û' => 'u', 'ü' => 'u', 'ý' => 'y', 'ÿ' => 'y'
);
精彩评论