str_replace - ã php
PHP reemplazando caracteres especiales como à-> a, è-> e (6)
A partir de PHP> = 5.4.0
$translatedString = transliterator_transliterate(''Any-Latin; Latin-ASCII; [/u0080-/u7fff] remove'', $string);
Tengo el documento php signup.php que guarda el contenido del formulario (en el documento form.php) en la base de MySQL. El problema surge cuando quiero volver a formatear el contenido de entrada. Quiero decodificar personajes de UTF-8 como à-> a.
$first_name=$_POST[''first_name''];
$last_name=$_POST[''last_name''];
$course=$_POST[''course''];
$chain="prêt-à-porter";
$pattern = array("''é''", "''è''", "''ë''", "''ê''", "''É''", "''È''", "''Ë''", "''Ê''", "''á''", "''à''", "''ä''", "''â''", "''å''", "''Á''", "''À''", "''Ä''", "''Â''", "''Å''", "''ó''", "''ò''", "''ö''", "''ô''", "''Ó''", "''Ò''", "''Ö''", "''Ô''", "''í''", "''ì''", "''ï''", "''î''", "''Í''", "''Ì''", "''Ï''", "''Î''", "''ú''", "''ù''", "''ü''", "''û''", "''Ú''", "''Ù''", "''Ü''", "''Û''", "''ý''", "''ÿ''", "''Ý''", "''ø''", "''Ø''", "''œ''", "''Œ''", "''Æ''", "''ç''", "''Ç''");
$replace = array(''e'', ''e'', ''e'', ''e'', ''E'', ''E'', ''E'', ''E'', ''a'', ''a'', ''a'', ''a'', ''a'', ''A'', ''A'', ''A'', ''A'', ''A'', ''o'', ''o'', ''o'', ''o'', ''O'', ''O'', ''O'', ''O'', ''i'', ''i'', ''i'', ''I'', ''I'', ''I'', ''I'', ''I'', ''u'', ''u'', ''u'', ''u'', ''U'', ''U'', ''U'', ''U'', ''y'', ''y'', ''Y'', ''o'', ''O'', ''a'', ''A'', ''A'', ''c'', ''C'');
$chain = preg_replace($pattern, $replace, $chain);
echo $chain; // print pret-a-porter
$first_name = preg_replace($pattern, $replace, $first_name);
echo $first_name; // does not change the input!?!
¿Por qué funciona perfectamente para $ chain, pero para $ first_name o $ last_name doesnt?
También intento
echo $first_name; // print áááááábéééééébšššš
$trans = array("á" => "a", "é" => "e", "š" => "s");
echo strtr("áááááábéééééébšššš", $trans); // print aaaaaabeeeeeebssss
echo strtr($first_name,$trans); // print áááááábéééééébšššš
pero el problema, como puedes ver, es el mismo!
Aquí hay una forma de tener cierta flexibilidad en lo que se debe descartar y lo que se debe reemplazar. Así es como lo hago actualmente.
$ string = ''À alguna cadena con basura Ĩ Ä'';
$replace = [
''<'' => '''', ''>'' => '''', ''''' => '''', ''&'' => '''',
''"'' => '''', ''À'' => ''A'', ''Á'' => ''A'', ''Â'' => ''A'', ''Ã'' => ''A'', ''Ä'' => ''Ae'',
''Ä'' => ''A'', ''Å'' => ''A'', ''Ā'' => ''A'', ''Ą'' => ''A'', ''Ă'' => ''A'', ''Æ'' => ''Ae'',
''Ç'' => ''C'', ''Ć'' => ''C'', ''Č'' => ''C'', ''Ĉ'' => ''C'', ''Ċ'' => ''C'', ''Ď'' => ''D'', ''Đ'' => ''D'',
''Ð'' => ''D'', ''È'' => ''E'', ''É'' => ''E'', ''Ê'' => ''E'', ''Ë'' => ''E'', ''Ē'' => ''E'',
''Ę'' => ''E'', ''Ě'' => ''E'', ''Ĕ'' => ''E'', ''Ė'' => ''E'', ''Ĝ'' => ''G'', ''Ğ'' => ''G'',
''Ġ'' => ''G'', ''Ģ'' => ''G'', ''Ĥ'' => ''H'', ''Ħ'' => ''H'', ''Ì'' => ''I'', ''Í'' => ''I'',
''Î'' => ''I'', ''Ï'' => ''I'', ''Ī'' => ''I'', ''Ĩ'' => ''I'', ''Ĭ'' => ''I'', ''Į'' => ''I'',
''İ'' => ''I'', ''IJ'' => ''IJ'', ''Ĵ'' => ''J'', ''Ķ'' => ''K'', ''Ł'' => ''K'', ''Ľ'' => ''K'',
''Ĺ'' => ''K'', ''Ļ'' => ''K'', ''Ŀ'' => ''K'', ''Ñ'' => ''N'', ''Ń'' => ''N'', ''Ň'' => ''N'',
''Ņ'' => ''N'', ''Ŋ'' => ''N'', ''Ò'' => ''O'', ''Ó'' => ''O'', ''Ô'' => ''O'', ''Õ'' => ''O'',
''Ö'' => ''Oe'', ''Ö'' => ''Oe'', ''Ø'' => ''O'', ''Ō'' => ''O'', ''Ő'' => ''O'', ''Ŏ'' => ''O'',
''Œ'' => ''OE'', ''Ŕ'' => ''R'', ''Ř'' => ''R'', ''Ŗ'' => ''R'', ''Ś'' => ''S'', ''Š'' => ''S'',
''Ş'' => ''S'', ''Ŝ'' => ''S'', ''Ș'' => ''S'', ''Ť'' => ''T'', ''Ţ'' => ''T'', ''Ŧ'' => ''T'',
''Ț'' => ''T'', ''Ù'' => ''U'', ''Ú'' => ''U'', ''Û'' => ''U'', ''Ü'' => ''Ue'', ''Ū'' => ''U'',
''Ü'' => ''Ue'', ''Ů'' => ''U'', ''Ű'' => ''U'', ''Ŭ'' => ''U'', ''Ũ'' => ''U'', ''Ų'' => ''U'',
''Ŵ'' => ''W'', ''Ý'' => ''Y'', ''Ŷ'' => ''Y'', ''Ÿ'' => ''Y'', ''Ź'' => ''Z'', ''Ž'' => ''Z'',
''Ż'' => ''Z'', ''Þ'' => ''T'', ''à'' => ''a'', ''á'' => ''a'', ''â'' => ''a'', ''ã'' => ''a'',
''ä'' => ''ae'', ''ä'' => ''ae'', ''å'' => ''a'', ''ā'' => ''a'', ''ą'' => ''a'', ''ă'' => ''a'',
''æ'' => ''ae'', ''ç'' => ''c'', ''ć'' => ''c'', ''č'' => ''c'', ''ĉ'' => ''c'', ''ċ'' => ''c'',
''ď'' => ''d'', ''đ'' => ''d'', ''ð'' => ''d'', ''è'' => ''e'', ''é'' => ''e'', ''ê'' => ''e'',
''ë'' => ''e'', ''ē'' => ''e'', ''ę'' => ''e'', ''ě'' => ''e'', ''ĕ'' => ''e'', ''ė'' => ''e'',
''ƒ'' => ''f'', ''ĝ'' => ''g'', ''ğ'' => ''g'', ''ġ'' => ''g'', ''ģ'' => ''g'', ''ĥ'' => ''h'',
''ħ'' => ''h'', ''ì'' => ''i'', ''í'' => ''i'', ''î'' => ''i'', ''ï'' => ''i'', ''ī'' => ''i'',
''ĩ'' => ''i'', ''ĭ'' => ''i'', ''į'' => ''i'', ''ı'' => ''i'', ''ij'' => ''ij'', ''ĵ'' => ''j'',
''ķ'' => ''k'', ''ĸ'' => ''k'', ''ł'' => ''l'', ''ľ'' => ''l'', ''ĺ'' => ''l'', ''ļ'' => ''l'',
''ŀ'' => ''l'', ''ñ'' => ''n'', ''ń'' => ''n'', ''ň'' => ''n'', ''ņ'' => ''n'', ''ʼn'' => ''n'',
''ŋ'' => ''n'', ''ò'' => ''o'', ''ó'' => ''o'', ''ô'' => ''o'', ''õ'' => ''o'', ''ö'' => ''oe'',
''ö'' => ''oe'', ''ø'' => ''o'', ''ō'' => ''o'', ''ő'' => ''o'', ''ŏ'' => ''o'', ''œ'' => ''oe'',
''ŕ'' => ''r'', ''ř'' => ''r'', ''ŗ'' => ''r'', ''š'' => ''s'', ''ù'' => ''u'', ''ú'' => ''u'',
''û'' => ''u'', ''ü'' => ''ue'', ''ū'' => ''u'', ''ü'' => ''ue'', ''ů'' => ''u'', ''ű'' => ''u'',
''ŭ'' => ''u'', ''ũ'' => ''u'', ''ų'' => ''u'', ''ŵ'' => ''w'', ''ý'' => ''y'', ''ÿ'' => ''y'',
''ŷ'' => ''y'', ''ž'' => ''z'', ''ż'' => ''z'', ''ź'' => ''z'', ''þ'' => ''t'', ''ß'' => ''ss'',
''ſ'' => ''ss'', ''ый'' => ''iy'', ''А'' => ''A'', ''Б'' => ''B'', ''В'' => ''V'', ''Г'' => ''G'',
''Д'' => ''D'', ''Е'' => ''E'', ''Ё'' => ''YO'', ''Ж'' => ''ZH'', ''З'' => ''Z'', ''И'' => ''I'',
''Й'' => ''Y'', ''К'' => ''K'', ''Л'' => ''L'', ''М'' => ''M'', ''Н'' => ''N'', ''О'' => ''O'',
''П'' => ''P'', ''Р'' => ''R'', ''С'' => ''S'', ''Т'' => ''T'', ''У'' => ''U'', ''Ф'' => ''F'',
''Х'' => ''H'', ''Ц'' => ''C'', ''Ч'' => ''CH'', ''Ш'' => ''SH'', ''Щ'' => ''SCH'', ''Ъ'' => '''',
''Ы'' => ''Y'', ''Ь'' => '''', ''Э'' => ''E'', ''Ю'' => ''YU'', ''Я'' => ''YA'', ''а'' => ''a'',
''б'' => ''b'', ''в'' => ''v'', ''г'' => ''g'', ''д'' => ''d'', ''е'' => ''e'', ''ё'' => ''yo'',
''ж'' => ''zh'', ''з'' => ''z'', ''и'' => ''i'', ''й'' => ''y'', ''к'' => ''k'', ''л'' => ''l'',
''м'' => ''m'', ''н'' => ''n'', ''о'' => ''o'', ''п'' => ''p'', ''р'' => ''r'', ''с'' => ''s'',
''т'' => ''t'', ''у'' => ''u'', ''ф'' => ''f'', ''х'' => ''h'', ''ц'' => ''c'', ''ч'' => ''ch'',
''ш'' => ''sh'', ''щ'' => ''sch'', ''ъ'' => '''', ''ы'' => ''y'', ''ь'' => '''', ''э'' => ''e'',
''ю'' => ''yu'', ''я'' => ''ya''
];
echo str_replace(array_keys($replace), $replace, $string);
Desearía encontrar este hilo antes. La función que hice (que me llevó demasiado tiempo) está a continuación:
function CheckLetters($field){
$letters = [
0 => "a à á â ä æ ã å ā",
1 => "c ç ć č",
2 => "e é è ê ë ę ė ē",
3 => "i ī į í ì ï î",
4 => "l ł",
5 => "n ñ ń",
6 => "o ō ø œ õ ó ò ö ô",
7 => "s ß ś š",
8 => "u ū ú ù ü û",
9 => "w ŵ",
10 => "y ŷ ÿ",
11 => "z ź ž ż",
];
foreach ($letters as &$values){
$newValue = substr($values, 0, 1);
$values = substr($values, 2, strlen($values));
$values = explode(" ", $values);
foreach ($values as &$oldValue){
while (strpos($field,$oldValue) !== false){
$field = preg_replace("/" . $oldValue . ''/'', $newValue, $field, 1);
}
}
}
return $field;
}
Forma de CodeIgniter:
$this->load->helper(''text'');
$string = convert_accented_characters($string);
Esta función utiliza un archivo de configuración complementario application/config/foreign_chars.php
para definir el conjunto application/config/foreign_chars.php
desde la transliteración.
https://www.codeigniter.com/user_guide/helpers/text_helper.html#ascii_to_entities
Hay una manera mucho más fácil de hacerlo, usando iconv
: a partir de las notas del usuario, esto parece ser lo que quieres hacer: transliteración de caracteres
// PHP.net User notes
<?php
$string = "ʿABBĀSĀBĀD";
echo iconv(''UTF-8'', ''ISO-8859-1//TRANSLIT'', $string);
// output: [nothing, and you get a notice]
echo iconv(''UTF-8'', ''ISO-8859-1//IGNORE'', $string);
// output: ABBSBD
echo iconv(''UTF-8'', ''ISO-8859-1//TRANSLIT//IGNORE'', $string);
// output: ABBASABAD
// Yay! That''s what I wanted!
?>
Sea muy concienzudo con sus codificaciones de caracteres, por lo que mantiene la misma codificación en todas las etapas del proceso: front-end, envío de formularios, codificación de los archivos de origen. La codificación predeterminada en PHP y en formularios es ISO-8859-1, antes de PHP 5.4 donde cambió a UTF8 (¡por fin!).
Hay algunas funciones con las que puedes jugar para obtener ideas. Primero es de la clase de infladores de CakePHP, llamada slug
:
public static function slug($string, $replacement = ''_'') {
$quotedReplacement = preg_quote($replacement, ''/'');
$merge = array(
''/[^/s/p{Ll}/p{Lm}/p{Lo}/p{Lt}/p{Lu}/p{Nd}]/mu'' => '' '',
''///s+/'' => $replacement,
sprintf(''/^[%s]+|[%s]+$/'', $quotedReplacement, $quotedReplacement) => '''',
);
$map = self::$_transliteration + $merge;
return preg_replace(array_keys($map), array_values($map), $string);
}
Depende de una matriz de self::$_transliteration
que es similar a lo que estaba haciendo en su pregunta: puede ver la fuente de inflector en github .
Otra es una función que uso personalmente, que proviene de aquí .
function slugify($text,$strict = false) {
$text = html_entity_decode($text, ENT_QUOTES, ''UTF-8'');
// replace non letter or digits by -
$text = preg_replace(''~[^//pL/d.]+~u'', ''-'', $text);
// trim
$text = trim($text, ''-'');
setlocale(LC_CTYPE, ''en_GB.utf8'');
// transliterate
if (function_exists(''iconv'')) {
$text = iconv(''utf-8'', ''us-ascii//TRANSLIT'', $text);
}
// lowercase
$text = strtolower($text);
// remove unwanted characters
$text = preg_replace(''~[^-/w.]+~'', '''', $text);
if (empty($text)) {
return ''empty_$'';
}
if ($strict) {
$text = str_replace(".", "_", $text);
}
return $text;
}
Lo que esas funciones hacen es transcribir y crear '' slugs '' a partir de la entrada de texto arbitraria, lo cual es algo muy útil de tener en su toolchest al hacer aplicaciones web. ¡Espero que esto ayude!
La cadena $ chain tiene la misma codificación de caracteres que los caracteres de la matriz; es posible, incluso probable, que la cadena $ first_name tenga una codificación diferente, por lo que esos caracteres no coinciden. En su lugar, puede intentar usar las funciones de cadenas multibyte.
Pruebe mb_convert_encoding. También puede intentar usar HTML_ENTITIES como el parámetro to_encoding, entonces no tiene que preocuparse por cómo se convertirán los caracteres, será muy predecible.
Suponiendo que su entrada a este script está en UTF-8, probablemente no sea un mal lugar para comenzar ...
$first_name = mb_convert_encoding($first_name, "HTML-ENTITIES", "UTF-8");