Следующая функция перезаписывает URL-адреса новостей и заголовков продуктов, содержащих всевозможные символы. Строка, которую я хочу создать, состоит только из буквенно-цифровых значений и «-», но без окончаний «-» или пробелов и повторных «-». Функция ниже работает отлично, но я задавался вопросом, есть ли способ написать ее проще или эффективнее?
function urlName($string) { $string = trim($string); // no open ends $string = strtolower($string); // all lowercase $string = strtr($string, 'äöåÄÖÅ', 'aoaaoa'); // substitute umlauts $string = preg_replace('/[\W]+/', '-', $string); // substitute non-word characters with - $string = preg_replace('/^-*|-*$/', '', $string); // no beinging or ending - return $string; }
Я думаю, что ваш код может быть сжат до этого:
function urlName($string) { $patterns = array('/^[\s-]+|[\s-]+$/', '/[\W]+/'); $replacements = array('', '-'); $string = strtr(strtolower($string), 'äöåÄÖÅ', 'aoaaoa'); // or you can use: // $string = strtr(strtolower($string), $someTrMapping); return preg_replace($patterns, $replacements, $string); }
Я часто использую это:
function simpleText($s) { $rpl = array( "À" => 'A', "Á" => 'A', "Â" => 'A', "Ã" => 'A', "Ä" => 'A', "Å" => 'A', "à" => 'a', "á" => 'a', "â" => 'a', "ã" => 'a', "ä" => 'a', "å" => 'a', "Ò" => 'O', "Ó" => 'O', "Ô" => 'O', "Õ" => 'O', "Ö" => 'O', "Ø" => 'O', "ò" => 'o', "ó" => 'o', "ô" => 'o', "õ" => 'o', "ö" => 'o', "ø" => 'o', "È" => 'E', "É" => 'E', "Ê" => 'E', "Ë" => 'E', "è" => 'e', "é" => 'e', "ê" => 'e', "ë" => 'e', "Ç" => 'C', "ç" => 'c', "Ì" => 'I', "Í" => 'I', "Î" => 'I', "Ï" => 'I', "ì" => 'i', "í" => 'i', "î" => 'i', "ï" => 'i', "Ù" => 'U', "Ú" => 'U', "Û" => 'U', "Ü" => 'U', "ù" => 'u', "ú" => 'u', "û" => 'u', "ü" => 'u', "Ÿ" => 'Y', "ÿ" => 'y', "Ñ" => 'N', "ñ" => 'n' ); $s = preg_replace('`\s+`', '_', strtr($s, $rpl)); $s = strtolower(preg_replace('`_+`', '_', preg_replace('`[^-_A-Za-z0-9]`', '', $s))); return trim($s, '_'); }