utf8 str_replace remove mb_convert_encoding htmlentities html_entity_decode accents php utf-8 preg-replace decode

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



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