Mejorar la conversión de cadena a URL legibles

La siguiente función reescribe las URL de los títulos de noticias y productos que contienen todo tipo de caracteres. La cadena que deseo crear consiste solo en valores alfanuméricos y "-", pero no termina en "-" o espacios en blanco y no repite "-". La siguiente función funciona bien, pero me preguntaba si hay alguna forma de escribirla de manera más simple o más eficiente.

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;
}

preguntado el 12 de junio de 12 a las 14:06

Esto se ha preguntado aquí antes con el código incluido. buscándolo ahora. -

¿Por qué solo diéresis? ¿Qué pasa con otros caracteres especiales como áéüíú? -

Los dominios -bažmegakapa no tienen, por lo que la mayoría de los usuarios esperan que las rutas se comporten de la misma manera. -John Conde gracias por el enlace - Creo que el problema es algo parecido, pero no exactamente igual. No le preocupan los nombres que contienen caracteres que no son palabras (como % - &, etc.) -Mike B ty, intentará agregar la etiqueta -

-bažmegakapa En realidad leí mal tu comentario. Tienes toda la razón sobre otros personajes también. Debo mencionar que el servidor ejecuta php 4.3, por lo que podría ser necesario algo como la tabla de conversión de yent :( -

2 Respuestas

Creo que su código se puede compactar a esto:

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);
}

Respondido el 12 de junio de 12 a las 14:06

Gracias por tu comentario. Me di cuenta de que el recorte no era necesario con el filtrado de expresiones regulares correcto de todos modos. Aceptaré su respuesta, porque no sabía que puede alimentar matrices de coincidencia y reemplazo de preg_replace, no solo valores individuales. - contorno

A menudo uso esto:

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, '_');
}

Respondido el 12 de junio de 12 a las 14:06

Gracias por la extensa tabla de conversión. - contorno

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.