search for in the  
<strtouppersubstr_compare>
Last updated: Thu, 19 May 2005

strtr

(PHP 3, PHP 4, PHP 5)

strtr -- Translate certain characters

Description

string strtr ( string str, string from, string to )

string strtr ( string str, array replace_pairs )

This function returns a copy of str, translating all occurrences of each character in from to the corresponding character in to.

If from and to are different lengths, the extra characters in the longer of the two are ignored.

Example 1. strtr() example

<?php
$addr
= strtr($addr, "äåö", "aao");
?>

strtr() may be called with only two arguments. If called with two arguments it behaves in a new way: from then has to be an array that contains string -> string pairs that will be replaced in the source string. strtr() will always look for the longest possible match first and will *NOT* try to replace stuff that it has already worked on.

Example 2. strtr() example with two arguments

<?php
$trans
= array("hello" => "hi", "hi" => "hello");
echo
strtr("hi all, I said hello", $trans);
?>

This will show:

hello all, I said hi

Note: This optional to and from parameters were added in PHP 4.0.0

See also ereg_replace().



User Contributed Notes
strtr
Jay K
03-May-2005 11:22
Several people have suggested using str_replace instead of strtr... Here is why that will not always work....

<?
   $string
= "This is a BIG test with SMALL RESULT\n";
  
$repl = array('BIG' => 'SMALL', 'SMALL' => 'BIG');
   echo
str_replace(array_keys($repl), array_values($repl), $string);
   echo
strtr($string, $repl);
?>

Results in:

This is a BIG test with BIG RESULT
This is a SMALL test with BIG RESULT

Notice that str_replace will replace previous replacements and strtr will not.
-sven (www.bitcetera.com)
21-Apr-2005 01:48
And while we're at it, yet another transcriber (the code formerly known as accent remover). It does accents and umlauts, but also ligatures and runes known to ISO-8859-1. The translation strings must be on one line without any whitespaces in it. They are rendered hardwrapped here because this documentation doesn't allow long lines in notes.

function transcribe($string) {
   $string = strtr($string,
       "\xA1\xAA\xBA\xBF\xC0\xC1\xC2\xC3\xC5\xC7
       \xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1
       \xD2\xD3\xD4\xD5\xD8\xD9\xDA\xDB\xDD\xE0
       \xE1\xE2\xE3\xE5\xE7\xE8\xE9\xEA\xEB\xEC
       \xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF8
       \xF9\xFA\xFB\xFD\xFF",
       "!ao?AAAAAC
       EEEEIIIIDN
       OOOOOUUUYa
       aaaaceeeei
       iiidnooooo
       uuuyy"); 
   $string = strtr($string, array("\xC4"=>"Ae", "\xC6"=>"AE", "\xD6"=>"Oe", "\xDC"=>"Ue", "\xDE"=>"TH", "\xDF"=>"ss", "\xE4"=>"ae", "\xE6"=>"ae", "\xF6"=>"oe", "\xFC"=>"ue", "\xFE"=>"th"));
   return($string);
}

(Funky: ISO-8859-1 does not cover the french "oe" ligature.)
info at oscaralexander dot com
13-Apr-2005 02:32
Here's a nice function for parsing a string to something suitable for URL rewriting (mod_rewrite). It translates all accented characters to their non-accented equivalents and replaces all other non-alphanumeric character with dashes:

function getRewriteString($sString) {
   $string    = htmlentities(strtolower($string));
   $string    = preg_replace("/&(.)(acute|cedil|circ|ring|tilde|uml);/", "$1", $string);
   $string    = preg_replace("/([^a-z0-9]+)/", "-", html_entity_decode($string));
   $string    = trim($string, "-");
   return $string;
}
Stian
02-Mar-2005 03:58
elonen forgot the ø character (\xf8)
A (more) complete accent remover:

$txt = strtr($txt,
 "\xe1\xc1\xe0\xc0\xe2\xc2\xe4\xc4\xe3\xc3\xe5\xc5".
 "\xaa\xe7\xc7\xe9\xc9\xe8\xc8\xea\xca\xeb\xcb\xed".
 "\xcd\xec\xcc\xee\xce\xef\xcf\xf1\xd1\xf3\xd3\xf2".
 "\xd2\xf4\xd4\xf6\xd6\xf5\xd5\x8\xd8\xba\xf0\xfa\xda".
 "\xf9\xd9\xfb\xdb\xfc\xdc\xfd\xdd\xff\xe6\xc6\xdf\xf8",
 "aAaAaAaAaAaAacCeEeEeEeEiIiIiIiInNo".
 "OoOoOoOoOoOoouUuUuUuUyYyaAso");
elonen at iki dot fi
25-Feb-2005 02:24
Yet another accent remover, this time pretty complete and without any 8-bit characters in the script itself:

$txt = strtr($txt,
 "\xe1\xc1\xe0\xc0\xe2\xc2\xe4\xc4\xe3\xc3\xe5\xc5".
 "\xaa\xe7\xc7\xe9\xc9\xe8\xc8\xea\xca\xeb\xcb\xed".
 "\xcd\xec\xcc\xee\xce\xef\xcf\xf1\xd1\xf3\xd3\xf2".
 "\xd2\xf4\xd4\xf6\xd6\xf5\xd5\x8\xd8\xba\xf0\xfa".
 "\xda\xf9\xd9\xfb\xdb\xfc\xdc\xfd\xdd\xff\xe6\xc6\xdf",
 "aAaAaAaAaAaAacCeEeEeEeEiIiIiIiInNoOoOoOoOoOoOoouUuUuUuUyYyaAs");
patrick at p-roocks dot de
06-Feb-2005 04:31
As Daijoubu suggested use str_replace instead of this function for large arrays/subjects. I just tried it with a array of 60 elements, a string with 8KB length, and the execution time of str_replace was faster at factor 20!

Patrick
Daijoubu
12-Jan-2005 05:19
Wouldn't:
<?php
$s
= str_replace(array_key($replace_array), array_value($replace_array), $s);
?>
be faster?
Perhaps even faster using 2 seperate arrays...
11-Dec-2004 07:20
If you are going to call strtr a lot, consider using str_replace instead, as it is much faster. I cut execution time in half just by doing this.

<?
// i.e. instead of:
$s=strtr($s,$replace_array);

// use:
foreach($replace_array as $key=>$value) $s=str_replace($key,$value,$s);
?>
oliver at modix dot de
22-Oct-2004 03:08
Replace control characters in a binary string:
<?

function cc_replace($in) {
       for (
$i = 0; $i <= 31; $i++) {
              
$from  .= chr($i);
              
$to    .= ".";
       }
       return
strtr($in, $from, $to);
}

?>
ktogias at math dot upatras dot gr
23-Sep-2004 05:32
This function is usefull for
accent insensitive regexp
searches into greek (iso8859-7) text:
(Select View -> Character Encoding -> Greek (iso8859-7)
at your browser to see the correct greek characters)

function gr_regexp($mystring){
       $replacement=array(
               array("¶","Á","á","Ü"),
               array("¸","Å","å","Ý"),
               array("¹","Ç","ç","Þ"),
               array("º","É","é","ß","ú","À"),
               array("¼","Ï","ï","ü"),
               array("¾","Õ","õ","ý","û","à"),
               array("¿","Ù","ù","þ")
       );
       foreach($replacement as $group){
               foreach($group as $character){
                       $exp="[";
                       foreach($group as $expcharacter){
                               $exp.=$expcharacter;
                       }
                       $exp.="]";
                       $trans[$character]=$exp;
               }
       }
       $temp=explode(" ", $mystring);
       for ($i=0;$i<sizeof($temp);$i++){
               $temp[$i]=strtr($temp[$i],$trans);
               $temp[$i]=addslashes($temp[$i]);
       }
       return implode(".*",$temp);
}

$match=gr_regexp("Óêïõëéêïìõñìéãêüôñõðá êáé ÔæéæéñéÜ");

//The next query string can be sent to MySQL
through mysql_query()
$query=
     "Select `column` from `table` where `column2` REGEXP 
                         '".$match."'";
from-php-net dot ticket at raf256 dot com
04-Jun-2004 06:59
Hi, before I found strtr() function I quickly wrote own repleacement, if someone is interested,

// by http://www.raf256.com - Rafal Maj
function ConvCharset($from,$to,$s) {
  $l=strlen($s);
  $S=''; // out put
  for ($i=0; $i<$l; $i++) {
   $c=$s[$i]; // curr char
   $x=strpos($from, $c);
   if ($x!==FALSE) $c=$to[$x];
   $S.=$c;
  }
  return $S;
}
volkris at tamu dot edu
19-Mar-2004 08:25
Regarding christophe's conversion, note that the \x## values should be in double quotes, not single, so that the escape will be applied.
christophe at publicityweb dot com
26-Feb-2004 02:04
Latin1 (iso-8859-1) DONT define chars \x80-\x9f (128-159),
but Windows charset 1252 defines _some_ of them
-- like the infamous msoffice 'magic quotes' (\x92 146).
Dont use those invalid control chars in webpages,
but their html (unicode) entities. See ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT
or http://www.microsoft.com/typography/unicode/1252.htm
PS: a '?' in the code means the win-cp1252 dont define the given char.

$badlatin1_cp1252_to_htmlent =
  array(
   '\x80'=>'&#x20AC;', '\x81'=>'?', '\x82'=>'&#x201A;', '\x83'=>'&#x0192;',
   '\x84'=>'&#x201E;', '\x85'=>'&#x2026;', '\x86'=>'&#x2020;', \x87'=>'&#x2021;',
   '\x88'=>'&#x02C6;', '\x89'=>'&#x2030;', '\x8A'=>'&#x0160;', '\x8B'=>'&#x2039;',
   '\x8C'=>'&#x0152;', '\x8D'=>'?', '\x8E'=>'&#x017D;', '\x8F'=>'?',
   '\x90'=>'?', '\x91'=>'&#x2018;', '\x92'=>'&#x2019;', '\x93'=>'&#x201C;',
   '\x94'=>'&#x201D;', '\x95'=>'&#x2022;', '\x96'=>'&#x2013;', '\x97'=>'&#x2014;',
   '\x98'=>'&#x02DC;', '\x99'=>'&#x2122;', '\x9A'=>'&#x0161;', '\x9B'=>'&#x203A;',
   '\x9C'=>'&#x0153;', '\x9D'=>'?', '\x9E'=>'&#x017E;', '\x9F'=>'&#x0178;'
  );
$str = strtr($str, $badlatin1_cp1252_to_htmlent);
rortiz_reyes at hotmail dot com
26-Jan-2004 11:15
If you have trouble accessing a file which has an accented or tilde letter (á,é,í,ó,ú, or ñ) via Internet Explorer use the following translation table:

$trans = array("á" => "%E1", "é" => "%E9", "í" => "%ED", "ó" => "%F3","ú" => "%FA", "ñ" => "%D1",
"Á" => "%A1", "É" => "%A9", "Í" => "%AD", "Ó" => "%B3","Ú" => "%BA", "ñ" => "%F1");

To obtain the translation for other special characters not used in English (for example, ù), type a fictitious filename on the Netscape 7.1 address bar (including URL, for example www.url.com/ù.jpg) and press enter.  Netscape traslates the character while Explorer simply can't handle it.

Seems like another bug on Explorer 6.0...

Regards,

Ricardo Ortiz R.
j at pureftpd dot org
30-Nov-2003 10:24
Here's a very useful function to translate Microsoft characters into Latin 15, so that people won't see any more square instead of characters in web pages .

function demicrosoftize($str) {
   return strtr($str,
"\x82\x83\x84\x85\x86\x87\x89\x8a" .
"\x8b\x8c\x8e\x91\x92\x93\x94\x95" .
"\x96\x97\x98\x99\x9a\x9b\x9c\x9e\x9f",
"'f\".**^\xa6<\xbc\xb4''" .
"\"\"---~ \xa8>\xbd\xb8\xbe");
}
Fernando "Malk" Piancastelli
29-Oct-2003 03:31
Here's a function to replace linebreaks to html <p> tags. This was initially designed to receive a typed text by a form in a "insert new notice" page and put in a database, then a "notice" page could get the text preformatted with paragraph tags instead of linebreaks that won't appear on browser. The function also removes repeated linebreaks the user may have typed in the form.

function break_to_tags(&$text) {

       // find and remove repeated linebreaks

       $double_break = array("\r\n\r\n" => "\r\n");
       do {
             $text = strtr($text, $double_break);
             $position = strpos($text, "\r\n\r\n");
       } while ($position !== false);

       // find and replace remanescent linebreaks by <p> tags

       $change = array("\r\n" => "<p>");
       $text = strtr($text, $change);
}

[]'s
Fernando
Sanate at seznam dot cz
17-Jul-2003 07:51
// Hello to all Czech and Slovak people!
// I hope this function can be useful and easier to find here,
// than at the original source (and opposite direction). :
//                  http://www.kosek.cz/clanky/tipy/qa07.html
// s pozdravem  Filip Rydlo  z Pohodasoftware.Cz

function latin2_to_win1250($text) {  // chce text v iso-88592
$text = StrTr($text, "\xA\xAB\xAE\xB\xBB\xBE",
                           "\x8A\x8D\x8E\x9A\x9D\x9E");
return $text;
}
mykel at has dot it
05-Feb-2003 08:08
strtr is a usefull encoding mechinism instead of using str_rot13. you can impliment it when you write usernames to a file, for example. but know that it is easy to crack your encription.
an example:
<?php
$unencripted
= "hello";
$from = "abcdefghijklmnopqrstuvwxyz";
$to =    "zyxwvutsrqponmlkjihgfedcba";
$temp = strtr($unencripted, $from, $to);
/* will return svool */
?>
hotmail - marksteward
26-Nov-2002 09:39
Referring to note from 11 October 2000, Thorn (Þ, þ), Eth (Ð, ð), Esset (ß) and Mu (µ) aren't really accented letters.  Œ, œ, Æ, æ are ligatures.  Best to do the following:

function removeaccents($string){
 return strtr(
  strtr($string,
   'ŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝàáâãäåçèéêëìíîïñòóôõöøùúûüýÿ',
   'SZszYAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy'),
  array('Þ' => 'TH', 'þ' => 'th', 'Ð' => 'DH', 'ð' => 'dh', 'ß' => 'ss',
   'Œ' => 'OE', 'œ' => 'oe', 'Æ' => 'AE', 'æ' => 'ae', 'µ' => 'u'));
}

This would be no good for sorting, as thorn and eth aren't actually found under th and dh.  Also especially redundant because of Unicode!  Still, I'm sure somone can find use for it - perhaps to constrict filenames...

Mark
m dot frank at beam dot ag
22-Nov-2002 07:12
to get the ascii equivalent of unicode characters simply use the
 
utf8_decode() function
marco dot colombo at nexor dot it
12-Nov-2002 08:20
Suppose you're trying to remove any character not in your set, i've found this very helpfull:

function my_remove($string, $my_set, $new=" ", $black="#")
{

  $first = strtr( $string, $my_set,
                   str_repeat($black, strlen($my_set)) );

  $second = strtr( $string, $first,
                   str_repeat($new, strlen($first)) );

  return $second;
};

NOTE that all non-wanted character will be replace with $new,
note also that $black must NOT to exist in $my_set.

Molok
bisqwit at iki dot fi
10-Aug-2002 12:18
#!/bin/sh
# This shell script generates a strtr() call
# to translate from a character set to another.
# Requires: gnu recode, perl, php commandline binary
#
# Usage:
#  Set set1 and set2 to whatever you prefer
#  (multibyte character sets are not supported)
#  and run the script. The script outputs
#  a strtr() php code for you to use.
#
# Example is set to generate a
# cp437..latin9 conversion code.
#
set1=cp437
set2=iso-8859-15
result="`echo '<? for($c=32;$c<256;$c++)'\
             '
echo chr($c);'\           
         |php -q|recode -f $set1..$set2`"
echo "// This php function call converts \$string in $set1 to $set2";
cat <<EOF  | php -q
<?php
\$set1='
`echo -n "$result"\
   |perl -pe "s/([\\\\\'])/\\\\\\\\\\$1/g"
`';
\$set2='
`echo -n "$result"|recode -f $set2..$set1\
   |perl -pe "s/([\\\\\'])/\\\\\\\\\\$1/g"
`';
\$erase=array();
\$l=strlen(\$set1);
for(\$c=0;\$c<\$l;++\$c)
  if(\$set1[\$c]==\$set2[\$c])\$erase[\$set1[\$c]]='';
if(count(\$erase))
{
  \$set1=strtr(\$set1,\$erase);
  \$set2=strtr(\$set2,\$erase);
}
if(!strlen(\$set1))echo '
IRREVERSIBLE';else
echo "strtr(\\\$string,\n  '",
     ereg_replace('([\\\\\\'])', '\\\\\\1', \$set2),
     "',\n  '",
     ereg_replace('([\\\\\\'])', '\\\\\\1', \$set1),
     "');";
EOF
gabi at unica dot edu
17-Jul-2002 07:32
To convert special chars to their html entities strtr you can use strtr in conjunction with get_html_translation_table(HTML_ENTITIES) :

$trans = get_html_translation_table(HTML_ENTITIES);
$html_code = strtr($html_code, $trans);

This will replace in $html_code the Á by &Aacute; , etc.
symlink23-remove-my-spleen at yahoo dot com
18-Apr-2002 11:33
As noted in the str_rot13 docs, some servers don't provide the str_rot13() function. However, the presence of strtr makes it easy to build your own facsimile thereof:

if (!function_exists('str_rot13')) {
   function str_rot13($str) {
       $from = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
       $to  = 'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM';

       return strtr($str, $from, $to);
   }
}

This is suitable for very light "encryption" such as hiding email addressess from spambots (then unscrambling them in a mail class, for example).

$mail_to=str_rot13("$mail_to");
erik at eldata dot se
23-Nov-2001 11:08
As an alternative to the not-yet-existing function stritr mentioned in the first note above You can easily do this:

strtr("abc","ABCabc","xyzxyz")

or more general:

strtr("abc",
strtoupper($fromchars).strtolower($fromchars),
$tochars.$tochars);

Just a thought.
persiflage2000 at yahoo dot com
01-Aug-2001 07:49
To replace unicode characters with their ascii equivalents, use

$my_string = strtr($my_string, $unicode_array);

using this array:

$unicode_array = array(
       "&#8211;" => "-",
       "&#8212;" => "-",
       "–" => "-",
       "&#8216;" => "'",
       "’" => "'",
       "&#8217;" => "'",
       "‘" => "'",
       "&#8230;" => "...",
       "…" => "...",
       "“" => "\"",
       "&#8220;" => "\"",
       "”" => "\"",
       "&#8221;" => "\"",
   );

It is important to note you need both the unicode contol character (&#8221;) AND its text equivalent (”).  For instance, text copied and pasted into your html form from M$ Word will have the control character, whereas the same text viewed in a browser and copied into your html form using drag-and-drop will have the text equivalent.

A pox on Redmond for the way M$ Word is set to convert all these characters to unicode equivalents by default.

Note: you can expand the array to get rid of accented characters too, but remember the same thing applies.  For example, both "&#352;" => "S" and "Š" => "S" should be added to the array.
JamesHeinrich at Technologist dot com
31-Jul-2001 05:15
To build on the provided example, this small function will translate all accented characters into non-accented ones:

function removeaccents($string) {
 return strtr($string, "ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ", "SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy");
}
herve at milk dot fr
11-Oct-2000 09:21
strtr() is useful when trying to convert a string from PHP to Javascript (as JS doesn't allow linebreaks in string declarations) :

<script language="Javascript">
<?php
 
print("var js_string = \"%s\";",strtr($php_string,"\n\r\t\0","    ");
?>

<strtouppersubstr_compare>
 Last updated: Thu, 19 May 2005
Copyright © 2001-2005 The PHP Group
All rights reserved.
This unofficial mirror is operated at: The Server Pages
Last updated: Thu May 19 17:35:34 2005 CDT