2011-01-24 27 views
20

Tengo cadenas con caracteres especiales que quiero convertir. Por lo general, encuentro manualmente todos los caracteres especiales y sus contrapartes "web safe" y los pongo en matrices. Luego uso preg_replace para reemplazar cada uno de los caracteres.Convertir cadena en URI seguro web

Pero no puedo evitar pensar que hay una solución más fácil ya que es un enfoque de reducción de errores.

Aquí es un ejemplo de lo que quiero:

Hans Günther -> hans-gunther 
Jären höst -> jaeren-hoest 
René Ågesen -> rene-aagesen 
+0

Esto se llama [transliteración] (http://en.wikipedia.org/wiki/Transliteration). – Gumbo

Respuesta

54

cadena urlencode (string $ str)

http://php.net/manual/en/function.urlencode.php

En realidad aquí es un gran post sobre la conversión de texto como el ejemplo anterior para buenas cadenas url-safe (probablemente mejor para usted que la función anterior):

http://cubiq.org/the-perfect-php-clean-url-generator

setlocale(LC_ALL, 'en_US.UTF8'); 
function toAscii($str, $replace=array(), $delimiter='-') { 
if(!empty($replace)) { 
    $str = str_replace((array)$replace, ' ', $str); 
} 

$clean = iconv('UTF-8', 'ASCII//TRANSLIT', $str); 
$clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $clean); 
$clean = strtolower(trim($clean, '-')); 
$clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean); 

return $clean; 
} 

Éstos son ejemplos de lo que hace:

echo toAscii("Mess'd up --text-- just (to) stress /test/ ?our! `little` \\clean\\ url fun.ction!?-->"); 
returns: messd-up-text-just-to-stress-test-our-little-clean-url-function 

echo toAscii("Perché l'erba è verde?", "'"); // Italian 
returns: perche-l-erba-e-verde 

echo toAscii("Peux-tu m'aider s'il te plaît?", "'"); // French 
returns: peux-tu-m-aider-s-il-te-plait 

echo toAscii("Tänk efter nu – förr'n vi föser dig bort"); // Swedish 
returns: tank-efter-nu-forrn-vi-foser-dig-bort 

echo toAscii("ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöùúûüýÿ"); 
returns: aaaaaaaeceeeeiiiidnooooouuuuyssaaaaaaaeceeeeiiiidnooooouuuuyy 

echo toAscii("Custom`delimiter*example", array('*', '`')); 
returns: custom-delimiter-example 

echo toAscii("My+Last_Crazy|delimiter/example", '', ' '); 
returns: my last crazy delimiter example 

Si desea convertir a algo así como un AE y etc se puede utilizar un script como el siguiente (lo siento, no sé acerca de una mejor forma de hacer esto):

setlocale(LC_ALL, 'de_DE'); 
$replace = array(
'illegal' => array('/Ä/', '/Ö/', '/Ü/', '/ä/', '/ö/', '/ü/', '/Â/', '/é/'), 
'legal' => array('Ae', 'Oe', 'Ue', 'ae', 'oe', 'ue', 'Aa', 'e') 
); 
$string = 'ich hätte gerne brötechen Mein Name ist Öles Âlex'; 
echo preg_replace($replace['illegal'], $replace['legal'], $string); 

//Output: "ich haette gerne broetechen Mein Name ist Oeles Aalex" 

puede obviamente ponerlo todo junto como esto (sólo convertir U> ue etc, sólo tiene que añadir más a la primera preg_replace):

setlocale(LC_ALL, 'en_US.UTF8'); 
function toAscii($str, $replace=array(), $delimiter='-') { 
    if(!empty($replace)) { 
     $str = str_replace((array)$replace, ' ', $str); 
    } 

$clean = preg_replace(array('/Ä/', '/Ö/', '/Ü/', '/ä/', '/ö/', '/ü/'), array('Ae', 'Oe', 'Ue', 'ae', 'oe', 'ue'), $str); 
    $clean = iconv('UTF-8', 'ASCII//TRANSLIT', $clean); 
    $clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $clean); 
    $clean = strtolower(trim($clean, '-')); 
    $clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean); 

    return $clean; 
} 

$text = "Hätten Sie gerne viele Brötchen? Wenn ja dann einfach *[email protected]#$%^&*()eingeben..."; 
echo toAscii($text); 
//OUTPUT: haetten-sie-gerne-viele-broetchen-wenn-ja-dann-einfach-eingeben 
+1

urlencode causará que los caracteres se codifiquen y no se lean fácilmente. Si solo está pasando los parámetros en una cadena de consulta, esto estará bien. Sin embargo, si intentas crear URL de fácil lectura, probablemente necesites seguir con una función de reemplazo. –

+0

sí ... acaba de agregar algo más después de darse cuenta de que – o1iver

+0

Esto no translitera * ä * a * ae *. – Gumbo

1

El código anterior no funciona para los caracteres acentuados.

para esto he tenido que cambiar myselt esta carácteres por el equivalente sin acento:

function replace_accent($str) 
{ 
    $a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'Ā', 'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ', 'ĉ', 'Ċ', 'ċ', 'Č', 'č', 'Ď', 'ď', 'Đ', 'đ', 'Ē', 'ē', 'Ĕ', 'ĕ', 'Ė', 'ė', 'Ę', 'ę', 'Ě', 'ě', 'Ĝ', 'ĝ', 'Ğ', 'ğ', 'Ġ', 'ġ', 'Ģ', 'ģ', 'Ĥ', 'ĥ', 'Ħ', 'ħ', 'Ĩ', 'ĩ', 'Ī', 'ī', 'Ĭ', 'ĭ', 'Į', 'į', 'İ', 'ı', 'IJ', 'ij', 'Ĵ', 'ĵ', 'Ķ', 'ķ', 'Ĺ', 'ĺ', 'Ļ', 'ļ', 'Ľ', 'ľ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'Ń', 'ń', 'Ņ', 'ņ', 'Ň', 'ň', 'ʼn', 'Ō', 'ō', 'Ŏ', 'ŏ', 'Ő', 'ő', 'Œ', 'œ', 'Ŕ', 'ŕ', 'Ŗ', 'ŗ', 'Ř', 'ř', 'Ś', 'ś', 'Ŝ', 'ŝ', 'Ş', 'ş', 'Š', 'š', 'Ţ', 'ţ', 'Ť', 'ť', 'Ŧ', 'ŧ', 'Ũ', 'ũ', 'Ū', 'ū', 'Ŭ', 'ŭ', 'Ů', 'ů', 'Ű', 'ű', 'Ų', 'ų', 'Ŵ', 'ŵ', 'Ŷ', 'ŷ', 'Ÿ', 'Ź', 'ź', 'Ż', 'ż', 'Ž', 'ž', 'ſ', 'ƒ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ǎ', 'ǎ', 'Ǐ', 'ǐ', 'Ǒ', 'ǒ', 'Ǔ', 'ǔ', 'Ǖ', 'ǖ', 'Ǘ', 'ǘ', 'Ǚ', 'ǚ', 'Ǜ', 'ǜ', 'Ǻ', 'ǻ', 'Ǽ', 'ǽ', 'Ǿ', 'ǿ'); 
    $b = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's', 'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a', 'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd', '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', 'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l', 'l', 'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R', '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', 'W', 'w', 'Y', 'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I', 'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o'); 
    return str_replace($a, $b, $str); 
} 
function toURI($str, $replace = array(), $delimiter = '-') 
{ 
    if(!empty($replace)) 
    { 
     $str = str_replace((array) $replace, ' ', $str); 
    } 

    $clean=replace_accent($str); 
    $clean = iconv('UTF-8', 'ASCII//TRANSLIT', $clean); 
    $clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $clean); 
    $clean = strtolower(trim($clean, '-')); 
    $clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean); 

    return $clean; 
} 

Ésta hacer el trabajo.