str_replace

(PHP 4, PHP 5, PHP 7)

str_replace×Ó×Ö·û´®Ìæ»»

˵Ã÷

str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] ) : mixed

¸Ãº¯Êý·µ»ØÒ»¸ö×Ö·û´®»òÕßÊý×é¡£¸Ã×Ö·û´®»òÊý×éÊǽ« subject ÖÐÈ«²¿µÄ search ¶¼±» replace Ìæ»»Ö®ºóµÄ½á¹û¡£

Èç¹ûûÓÐһЩÌØÊâµÄÌæ»»ÐèÇ󣨱ÈÈçÕýÔò±í´ïʽ£©£¬ÄãÓ¦¸ÃʹÓøú¯ÊýÌæ»» ereg_replace() ºÍ preg_replace()¡£

²ÎÊý

Èç¹û search ºÍ replace ΪÊý×飬ÄÇô str_replace() ½«¶Ô subject ×ö¶þÕßµÄÓ³ÉäÌæ»»¡£Èç¹û replace µÄÖµµÄ¸öÊýÉÙÓÚ search µÄ¸öÊý£¬¶àÓàµÄÌæ»»½«Ê¹ÓÿÕ×Ö·û´®À´½øÐС£Èç¹û search ÊÇÒ»¸öÊý×é¶ø replace ÊÇÒ»¸ö×Ö·û´®£¬ÄÇô search ÖÐÿ¸öÔªËصÄÌæ»»½«Ê¼ÖÕʹÓÃÕâ¸ö×Ö·û´®¡£¸Ãת»»²»»á¸Ä±ä´óСд¡£

Èç¹û search ºÍ replace ¶¼ÊÇÊý×飬ËüÃǵÄÖµ½«»á±»ÒÀ´Î´¦Àí¡£

search

²éÕÒµÄÄ¿±êÖµ£¬Ò²¾ÍÊÇ needle¡£Ò»¸öÊý×é¿ÉÒÔÖ¸¶¨¶à¸öÄ¿±ê¡£

replace

search µÄÌæ»»Öµ¡£Ò»¸öÊý×é¿ÉÒÔ±»ÓÃÀ´Ö¸¶¨¶àÖØÌæ»»¡£

subject

Ö´ÐÐÌæ»»µÄÊý×é»òÕß×Ö·û´®¡£Ò²¾ÍÊÇ haystack¡£

Èç¹û subject ÊÇÒ»¸öÊý×飬Ìæ»»²Ù×÷½«±éÀúÕû¸ö subject£¬·µ»ØÖµÒ²½«ÊÇÒ»¸öÊý×é¡£

count

Èç¹û±»Ö¸¶¨£¬ËüµÄÖµ½«±»ÉèÖÃΪÌæ»»·¢ÉúµÄ´ÎÊý¡£

·µ»ØÖµ

¸Ãº¯Êý·µ»ØÌæ»»ºóµÄÊý×é»òÕß×Ö·û´®¡£

·¶Àý

Example #1 str_replace() »ù±¾·¶Àý

<?php
// ¸³Öµ: <body text='black'>
$bodytag str_replace("%body%""black""<body text='%body%'>");

// ¸³Öµ: Hll Wrld f PHP
$vowels = array("a""e""i""o""u""A""E""I""O""U");
$onlyconsonants str_replace($vowels"""Hello World of PHP");

// ¸³Öµ: You should eat pizza, beer, and ice cream every day
$phrase  "You should eat fruits, vegetables, and fiber every day.";
$healthy = array("fruits""vegetables""fiber");
$yummy   = array("pizza""beer""ice cream");

$newphrase str_replace($healthy$yummy$phrase);

// ¸³Öµ: 2
$str str_replace("ll""""good golly miss molly!"$count);
echo 
$count;
?>

Example #2 ¿ÉÄÜµÄ str_replace() Ìæ»»·¶Àý

<?php
// Ì滻˳Ðò
$str     "Line 1\nLine 2\rLine 3\r\nLine 4\n";
$order   = array("\r\n""\n""\r");
$replace '<br />';

// Ê×ÏÈÌæ»» \r\n ×Ö·û£¬Òò´ËËüÃDz»»á±»Á½´Îת»»
$newstr str_replace($order$replace$str);

// Êä³ö F £¬ÒòΪ A ±» B Ìæ»»£¬B ÓÖ±» C Ìæ»»£¬ÒÔ´ËÀàÍÆ...
// ÓÉÓÚ´Ó×óµ½ÓÒÒÀ´ÎÌæ»»£¬×îÖÕ E ±» F Ìæ»»
$search  = array('A''B''C''D''E');
$replace = array('B''C''D''E''F');
$subject 'A';
echo 
str_replace($search$replace$subject);

// Êä³ö: apearpearle pear
// ÓÉÓÚÉÏÃæÌáµ½µÄÔ­Òò
$letters = array('a''p');
$fruit   = array('apple''pear');
$text    'a p';
$output  str_replace($letters$fruit$text);
echo 
$output;
?>

×¢ÊÍ

Note: ´Ëº¯Êý¿É°²È«ÓÃÓÚ¶þ½øÖƶÔÏó¡£

Caution

Á˽âÌ滻˳Ðò

ÓÉÓÚ str_replace() µÄÌ滻ʱ´Ó×óµ½ÓÒÒÀ´Î½øÐеģ¬½øÐжàÖØÌæ»»µÄʱºò¿ÉÄÜ»áÌæ»»µô֮ǰ²åÈëµÄÖµ¡£²Î¼û¸ÃÎĵµµÄ·¶Àý¡£

Note:

¸Ãº¯ÊýÇø·Ö´óСд¡£Ê¹Óà str_ireplace() ¿ÉÒÔ½øÐв»Çø·Ö´óСдµÄÌæ»»¡£

²Î¼û

User Contributed Notes

ravenswd at gmail dot com 11-Jul-2018 01:33
This is what happens when the search and replace arrays are different sizes:

<?php
$search 
= array('a', 'b', 'c', 'd', 'e');
$replace = array('A', 'B', 'C');
$subject = 'abcdefg';
echo
str_replace($search, $replace, $subject);
// result: 'ABCfg'

$search  = array('a', 'b', 'c');
$replace = array('A', 'B', 'C', 'D', 'E');
$subject = 'abcdefg';
echo
str_replace($search, $replace, $subject);
// result: 'ABCdefg'
?>

No warning or error is generated in either of these cases.
ASchmidt at Anamera dot net 20-May-2018 04:22
Escaping strings with control characters, quotes and backslashes for subsequent use in MySQL commands.

MySQL has documented a number of backslash escape sequences that need to be used to pass certain values in SQL commands: https://dev.mysql.com/doc/refman/5.7/en/string-literals.html

It's crucial to escape existing backslashes first to prevent double-escaping, before escaping the various control sequences:

<?php
$result
= str_replace(
                array(
'\\',    "\0",   "'",    "\x8" /* BS */, "\n",   "\r",   "\t",   "\x1A" /* Ctrl+Z */ ),
                array(
'\\\\''\\0''\\\'', '\\b',          '\\n''\\r''\\t''\\Z' ),
               
$value );
?>

This code is NOT intended to protect against SQL insertions, it's intended to PRESERVE string content correctly, if it contains control characters.
jefrey at forteras dot tech 02-Mar-2018 02:54
NEVER USE this function to protect against SQL Injection.

It may sound ridiculous but I've seen a couple of developers doing so.

It's interesting that these developers use str_replace (let's ignore the fact that they don't even use the str_ireplace which is case-insensitive) to remove common SQL commands such as "SELECT" or "DROP" from user-entered inputs.

A funny thing to note is that:

<?php
$input
= "SELSELECTECT";
echo
str_replace("SELECT", null, $input); // = SELECT
?>

Yeah you could loop it, but str_replace was never meant to be used this way. There are proper ways to protect against SQL Injections, such as using prepared statements (placeholders).
Oyedele Hammed Horlah - itz dot harmid at gmail dot com 08-Oct-2017 08:05
this is a simple function to replace all newlines to <br> tags.

\r\n - windows line break
\n - linux line break
\r - mac line break

<?php
function nl_to_br($str) {
return
str_replace(array("\r\n","\n","\r"), "<br/>", $str);
}
echo
nl_to_br('Hello world\n I am Oyedele Hammed Horlah'); // => Hello World <br> I am Oyedele Hammed Horlah
?>

Enjoy
vuabid at hotmail dot com 06-Sep-2017 08:44
Consider this while using str_replace function when $search and $replace are arrays.

$search = array( 'login_reactivate', 'login_reactivate_date' );
$replace = array( 'login reactivate status', 'login reactivate date' );
$subject = "fname, email, login_reactivate, login_reactivate_date";

$returnValue = str_replace( $search, $replace, $subject );

$returnValue will be:
fname, email, login reactivate status, login reactivate status_date

You can see we are expecting "login_reactivate_date" to be replaced with "login reactivate date" but it will replace to "login reactivate status_date"
Anonymous 18-May-2017 01:57
As others have written, the replaced part can be replaced again if one uses an associative array. If you simply want to replace a certain string with another one, this will work instead:

$string = 'A';
$replace = array( 'A' => 'B', 'B' => 'C');

foreach ($replace as $arraykey => $arrayvalue)
{
  if ($string === $arraykey)
  {
    $string = $arrayvalue;
    break;
  }
}
   
$string2 = 'A';
$string2 = str_replace(array_keys($replace), $replace, $string2);
   
echo $string; // B
echo $string2; // C
info at 24h-workers dot de 22-Apr-2017 10:25
I had problems with the import of text into a textarea field.
The line feed crashes the HTML Page. This solution helps:

$Text = str_replace(array("\r\n", "\r", "\n"), '\n', $Text);

Pay attention to single quote and double quote char.
flame2000 at mail dot ru 21-Sep-2016 07:17
Replace chars in multi-byte string.
In example, replacing 'f'=>'b', 'o'=>'e', 't'=>'r' and etc.

<?php
function mb_chars_replace($from, $to, $subj, $delSymb='_') {
    
$nsubj='';
    
preg_match_all('/(.)/u', $subj, $subj);$subj=$subj[1];
     if (!
is_array($from)) {preg_match_all('/(.)/u', $from, $from);$from=$from[1];}
     if (!
is_array($to)) {preg_match_all('/(.)/u', $to, $to);$to=$to[1];}
     if (
count($from)!==count($to)) return false;

     foreach(
$subj as $s) {
       foreach(
$from as $k=>$f) {
         if(
$s===$f) {
                   
$s=$to[$k];
                    break;
         }
       }
       if(
$s!==$delSymb) $nsubj.=$s;
     }
    return
$nsubj;
}

//examples:

$from="fotber, ";
$to="berfot+_";

// or

$from=array("f","o","t","b","e","r",","," ");
$to=array("b","e","r","f","o","t","+","_");

//out:
echo mb_chars_replace($from,$to,"foot, beer"); //beer+foot
?>
viundan at gmail dot com 26-Aug-2016 04:08
Decision to avoid problem "it might replace a previously inserted value when doing multiple replacements. See also the examples in this document."

$urls - array of urls i want to replace with tag <a> and urls could be similar
http://abc.com/parameter/
http://abc.com/

// at first sort by length to have longest firstly
usort($urls,'sortByLen');

$replaces=[];

// replace all urls with unique
foreach($urls as $url){
    $replace = '__REPLACE' . uniqid() . '__';    
    $text = str_replace($url,$replace, $text);
    $replaces[$replace] = '<a href="' . $url . '">' . $url . '</a>';
}

foreach($replaces as $key => $replace){
    $text = str_replace($key,$replace, $text);
}

--------------

function sortByLen($a,$b){
    return strlen($b)-strlen($a);
}

Hope it will help others like me
Mohsin Ali (puregenius02 at gmail dot com) 06-May-2016 10:28
$myString = "It was the best of mine it was the worst of mine,";
// Displays "It was the best of bananas, it was the worst of bananas,"
echo str_replace( "mine", "bananas", $myString );
If you want to know how many times the search string was replaced, pass in a variable as an optional
fourth argument. After the function runs, this variable holds the number of replacements:
$myString = "It was the best of mine, it was the worst of mine,";
// Displays "It was the best of bananas, it was the worst of bananas,"
echo str_replace( "mine", "bananas", $myString, $num ) . " < br/ > ";
// Displays "The text was replaced 2 times."
echo "The text was replaced $num times. < br/ > ";
David Holt 05-Feb-2016 02:59
Be aware that if you use this for filtering & sanitizing some form of user input, or remove ALL instances of a string, there's another gotcha to watch out for:

// Remove all double characters
$string="1001011010";
$string=str_replace(array("11","00"),"",$string);
// Output: "110010"

$string="<ht<html>ml> Malicious code </<html>html> etc";
$string=str_replace(array("<html>","</html>"),"",$string);
// Output: "<html> Malicious code </html> etc"
kkumar dot sandeep89 at gmail dot com 30-Dec-2015 09:33
I came across requirement to replace some occurrences of a letter with other letter in a word:

<?php

$a
=    'ctl00_ContentPlaceHolder1_Rpt_data_ctl01_lnk_name';
$b =    'ctl00$ContentPlaceHolder1$Rpt_data$ctl01$lnk_name';

echo
"db has $a\n";
echo
"we want $b\n";

//Make replacement array
$replacement = array(
    array(
'_','$'),
    array(
'_','$'),
    array(
'_','_'),
    array(
'_','$'),
    array(
'_','$'),
    array(
'_','$'),
);

//call function
echo replaceByArray($a,$replacement);

function
replaceByArray($a, $replacement){
   
$j=0;
    for(
$i=0; $i<strlen($a); $i++){
        if(
$a[$i]==$replacement[$j][0]){
           
$a[$i] = $replacement[$j][1];    //make replacement
           
$j++;        //increment index of replacement array
           
if($j == (count($replacement)-1)) break;    //break out of loop if replacement array processed
       
}
    }

    return
$a;
}
?>
mrrehbein at gmail dot com 03-Apr-2015 01:25
nikolaz dot tang at hotmail dot com's solution of using json_encode/decode is interesting, but a couple of issues to be aware of with it.

<?php
// From: nikolaz dot tang at hotmail dot com's post
function str_replace_json($search, $replace, $subject){
     return
json_decode(str_replace($search, $replacejson_encode($subject)));
}
?>

json_decode will return objects, where arrays are probably expected.  This is easily remedied by adding 2nd parameter 'true' to json_decode.

$search and $replace could contain strings that match json encoding, which will either change the structure returned by this method, or break the json.

ie:
<?php
var_dump
(str_replace_json('":"', '","', ['this' => 'stuff']));
var_dump(str_replace_json('this":"', 'this" : "thing", "with":"', ['this' => 'stuff']));
?>
borasahin at gmail dot com 02-Mar-2015 08:59
jSON Turkish Characters Problem - (PHP < 5.4 for example)

<?php
function json_decode_tr($json){
      
$json_char = array("u00e7","u0131","u00fc","u011f","u00f6","u015f","u0130","u011e","u00dc","u00d6","u015e","u00c7");
      
$turkish = array("?","?","¨¹","?","?","?","?","?","¨¹","?","?","?");
      
$result = str_replace($json_char, $turkish, $json);
       return
json_decode($json);
    }
?>
karst at onlinq dot nl 17-Oct-2014 01:57
"If search is an array and replace is a string, then this replacement string is used for every value of search. The converse would not make sense, though. "

I think one important (and not at all vaguely theoretical) use-case is completely ignored here. Take, for example, the way the PDO handles parameter replacement.

If we have the following query:
"SELECT * FROM my_table WHERE (id = ? AND my_column = ? AND other_column = ?);"
The "?"s should be replaced by each successive variable in a $parameters array. That is EXACTLY the use case for "search" being a value and "replace" being an array.

Considering that this is not only a real-world example but also part of a core PHP functionality I find it very strange that it's dismissed so easily here.
Ing. Mirko Plazotta 04-Sep-2014 09:27
<?php
// a very beatiful way to do multiple replacements is this one, using just one array
$replaceThis = Array(
'old word' => 'new word',
'was' => 'it',
'past' => 'future',
);

$originalText = "every old word was a thing of the past...";
$replacedText = str_replace(array_keys($replaceThis), $replaceThis, $originalText);
echo
$replacedText;
?>
markem at sim1 dot us 27-Aug-2014 08:04
I was working with MySQL and displaying the title to things on the web page.  I'd written a script to ensure single and double quotes were removed from the title.  I used

    $title = str_replace( "'", "", $title );

and

     $title = str_replace( '"', "", $title );

But still the single and double quotes continued.  So I wrote a bit of code to print out each character separated by a dash.  Like so:

     for( $i=0; $i<strlen($title); $i++ ){
         echo "$i-";
         }

     echo "<br>\n";

This displayed:

     m-y-c-o-m-p-a-n-y- b-b-&-#-3-9-;-s

Which made me go "Oh!  I get it."

The MySQL function real_escape_string modifies the single quotes to be &#39; and double quotes as &#34;  These still show up as single and double quotes under HTML and most importantly -

     JAVASCRIPT sees the &#34; and &#39; as actual single or double
     quotes.  So if you are passing arguments to a function you have
     to get rid of them or else you will get an error on trying to call
     a given function.  Example:

     <a href="javascript:func1('mycompany bbs&#39;s")'">

     becomes

     <a href="javascript:func1('mycompany bbs's');">

Which then will give you an error because there is a single quote inside of the single quoted string.  HOWEVER, the

     $title = str_replace( "'", "", $title );

WILL NOT FIND a single quote.  Instead, you have to do this:

     $title = str_replace( "&#39;", "'", $title );
and
     $title = str_relace( "&#34;", '"', $title );

(Or you could just get rid of them.)

So remember!  If you are trying to remove single and double quotes and are using MySQL and MySQL's real_escape_string() function that you might be having single and double quotes hanging around which are defined as &#39; and &#34; but which show up as single and double quotes as well as causing problems in your Javascripts.
Anonymous 19-Jul-2013 10:01
@moostende at gmail dot com
If you want to remove all dashes but one from the string '-aaa----b-c-----d--e---f' resulting in '-aaa-b-c-d-e-f', you CAN use str_replace !

<?php
function foo($str)
{
    do {
       
$str = str_replace("--", "-", $str, $count);
    } while (
$count > 0);
    return
$str;
}
echo
foo("-aaa----b-c-----d--e---f");
?>

This outputs the following:
-aaa-b-c-d-e-f
cmbecker69 at gmx dot de 17-Jun-2013 01:53
To collapse multiple consecutive space characters to a single one, don't use str_replace() inside a loop--use preg_replace() instead for clarity and better performance:

<?php

$str
= ' This is    a    test   ';
$str = preg_replace('/ +/', ' ', $str);

?>
kriscraig at php dot net 20-Jul-2012 11:03
<?php

/**
 * Convert foreign 8859-1 characters into HTML entities.
 *
 * @param string $str
 *   The string being parsed.
 *
 * @return string
 *   The converted string.
 */
public static function convert_chars_to_entities( $str )
{
   
$str = str_replace( '¨¤', '&#192;', $str );
   
$str = str_replace( '¨¢', '&#193;', $str );
   
$str = str_replace( '?', '&#194;', $str );
   
$str = str_replace( '?', '&#195;', $str );
   
$str = str_replace( '?', '&#196;', $str );
   
$str = str_replace( '?', '&#197;', $str );
   
$str = str_replace( '?', '&#198;', $str );
   
$str = str_replace( '?', '&#199;', $str );
   
$str = str_replace( '¨¨', '&#200;', $str );
   
$str = str_replace( '¨¦', '&#201;', $str );
   
$str = str_replace( '¨º', '&#202;', $str );
   
$str = str_replace( '?', '&#203;', $str );
   
$str = str_replace( '¨¬', '&#204;', $str );
   
$str = str_replace( '¨ª', '&#205;', $str );
   
$str = str_replace( '?', '&#206;', $str );
   
$str = str_replace( '?', '&#207;', $str );
   
$str = str_replace( 'D', '&#208;', $str );
   
$str = str_replace( '?', '&#209;', $str );
   
$str = str_replace( '¨°', '&#210;', $str );
   
$str = str_replace( '¨®', '&#211;', $str );
   
$str = str_replace( '?', '&#212;', $str );
   
$str = str_replace( '?', '&#213;', $str );
   
$str = str_replace( '?', '&#214;', $str );
   
$str = str_replace( '¡Á', '&#215;', $str );  // Yeah, I know.  But otherwise the gap is confusing.  --Kris
   
$str = str_replace( '?', '&#216;', $str );
   
$str = str_replace( '¨´', '&#217;', $str );
   
$str = str_replace( '¨²', '&#218;', $str );
   
$str = str_replace( '?', '&#219;', $str );
   
$str = str_replace( '¨¹', '&#220;', $str );
   
$str = str_replace( 'Y', '&#221;', $str );
   
$str = str_replace( 'T', '&#222;', $str );
   
$str = str_replace( '?', '&#223;', $str );
   
$str = str_replace( '¨¤', '&#224;', $str );
   
$str = str_replace( '¨¢', '&#225;', $str );
   
$str = str_replace( 'a', '&#226;', $str );
   
$str = str_replace( '?', '&#227;', $str );
   
$str = str_replace( '?', '&#228;', $str );
   
$str = str_replace( '?', '&#229;', $str );
   
$str = str_replace( '?', '&#230;', $str );
   
$str = str_replace( '?', '&#231;', $str );
   
$str = str_replace( '¨¨', '&#232;', $str );
   
$str = str_replace( '¨¦', '&#233;', $str );
   
$str = str_replace( '¨º', '&#234;', $str );
   
$str = str_replace( '?', '&#235;', $str );
   
$str = str_replace( '¨¬', '&#236;', $str );
   
$str = str_replace( '¨ª', '&#237;', $str );
   
$str = str_replace( '?', '&#238;', $str );
   
$str = str_replace( '?', '&#239;', $str );
   
$str = str_replace( 'e', '&#240;', $str );
   
$str = str_replace( '?', '&#241;', $str );
   
$str = str_replace( '¨°', '&#242;', $str );
   
$str = str_replace( '¨®', '&#243;', $str );
   
$str = str_replace( '?', '&#244;', $str );
   
$str = str_replace( '?', '&#245;', $str );
   
$str = str_replace( '?', '&#246;', $str );
   
$str = str_replace( '¡Â', '&#247;', $str );  // Yeah, I know.  But otherwise the gap is confusing.  --Kris
   
$str = str_replace( '?', '&#248;', $str );
   
$str = str_replace( '¨´', '&#249;', $str );
   
$str = str_replace( '¨²', '&#250;', $str );
   
$str = str_replace( '?', '&#251;', $str );
   
$str = str_replace( '¨¹', '&#252;', $str );
   
$str = str_replace( 'y', '&#253;', $str );
   
$str = str_replace( 't', '&#254;', $str );
   
$str = str_replace( '?', '&#255;', $str );
   
    return
$str;
}
?>
bfrohs at gmail dot com 10-Jul-2012 06:27
This function implements $limit for str_replace(); is 100% backward compatible with str_replace(); uses str_replace() whenever possible (for performance reasons); supports arrays for $search, $replace, and $subject; and is fully commented.

<?php
/**
 * Replace $limit occurences of the search string with the replacement
 * @param mixed $search The value being searched for. An array may be used to
 * designate multiple needles.
 * @param mixed $replace The replacement value that replaces found search
 * values. An array may be used to designate multiple replacements.
 * @param mixed $subject The string or array being searched and replaced on. If
 * subject is an array, then the search and replace is performed with every
 * entry of subject, and the return value is an array as well.
 * @param string $count If passed, this will be set to the number of
 * replacements performed.
 * @param int $limit The maximum possible replacements for each pattern in each
 * subject string. Defaults to -1 (no limit).
 * @return string This function returns a string with the replaced values.
 */
function str_replace_limit($search, $replace, $subject, &$count, $limit = -1){
 
$count = 0;
 
// Invalid $limit provided
 
if(!($limit===strval(intval(strval($limit))))){
 
trigger_error('Invalid $limit `'.$limit.'` provided. Expecting an '.
   
'integer', E_USER_WARNING);
  return
$subject;
 }
 
// Invalid $limit provided
 
if($limit<-1){
 
trigger_error('Invalid $limit `'.$limit.'` provided. Expecting -1 or '.
   
'a positive integer', E_USER_WARNING);
  return
$subject;
 }
 
// No replacements necessary
 
if($limit===0){
 
trigger_error('Invalid $limit `'.$limit.'` provided. Expecting -1 or '.
   
'a positive integer', E_USER_NOTICE);
  return
$subject;
 }
 
// Use str_replace() when possible
 
if($limit===-1){
  return
str_replace($search, $replace, $subject, $count);
 }
 if(
is_array($subject)){
 
// Loop through $subject values
 
foreach($subject as $key => $this_subject){
  
// Skip values that are arrays
  
if(!is_array($this_subject)){
   
// Call this function again
   
$this_function = __FUNCTION__;
   
$subject[$key] = $this_function($search, $replace, $this_subject, $this_count, $limit);
   
// Adjust $count
   
$count += $this_count;
   
// Adjust $limit
   
if($limit!=-1){
    
$limit -= $this_count;
    }
   
// Reached $limit
   
if($limit===0){
     return
$subject;
    }
   }
  }
  return
$subject;
 } elseif(
is_array($search)){
 
// Clear keys of $search
 
$search = array_values($search);
 
// Clear keys of $replace
 
if(is_array($replace)){
  
$replace = array_values($replace);
  }
 
// Loop through $search
 
foreach($search as $key => $this_search){
  
// Don't support multi-dimensional arrays
  
$this_search = strval($this_search);
  
// If $replace is an array, use $replace[$key] if exists, else ''
  
if(is_array($replace)){
    if(
array_key_exists($key, $replace)){
    
$this_replace = strval($replace[$key]);
    } else {
    
$this_replace = '';
    }
   } else {
   
$this_replace = strval($replace);
   }
  
// Call this function again for
  
$this_function = __FUNCTION__;
  
$subject = $this_function($this_search, $this_replace, $subject, $this_count, $limit);
  
// Adjust $count
  
$count += $this_count;
  
// Adjust $limit
  
if($limit!=-1){
   
$limit -= $this_count;
   }
  
// Reached $limit
  
if($limit===0){
    return
$subject;
   }
  }
  return
$subject;
 } else {
 
$search = strval($search);
 
$replace = strval($replace);
 
// Get position of first $search
 
$pos = strpos($subject, $search);
 
// Return $subject if $search cannot be found
 
if($pos===false){
   return
$subject;
  }
 
// Get length of $search
 
$search_len = strlen($search);
 
// Loop until $search cannot be found or $limit is reached
 
for($i=0;(($i<$limit)||($limit===-1));$i++){
  
$subject = substr_replace($subject, $replace, $pos, $search_len);
  
// Increase $count
  
$count++;
  
// Get location of next $search
  
$pos = strpos($subject, $search);
  
// Break out of loop
  
if($pos===false){
    break;
   }
  }
  return
$subject;
 }
}
?>
christof dot rieger at r-tron dot de 25-Apr-2012 08:41
In many countries the numeric format is 1.000,33 in english it is 1,000.33

This function converts numeric arguments always into the PHP confirm numeric format. If only one seperator is into the numericstring so it is interpreted as the decimalpoint.

 function dp($zahl)
{
  if ((strpos($zahl,".") > "-1") | (strpos($zahl,",") > "-1")) {
    if ((strpos($zahl,".") > "-1") & (strpos($zahl,",") > "-1")) {
      if (strpos($zahl,".") > strpos($zahl,",")){
          return str_replace(",","",$zahl);
    } else {
          return str_replace(",",".",str_replace(".","",$zahl));
      }
  } else {
      if (strpos($zahl,".") > "-1") {
        if (strpos($zahl,".") == strrpos($zahl,".")) {
            return $zahl;
      } else {
          return str_replace(".","",$zahl);         
        }
    } else {
        if (strpos($zahl,",") == strrpos($zahl,",")) {
          return str_replace(",",".",$zahl);
      } else {
          return str_replace(",","",$zahl);         
        }
    } }
} else {
    return $zahl;
} }
Denzel Morris 06-Apr-2012 02:43
Maybe obvious to veteran PHP programmers but less so to novice PHP programmers is the fact that this is invalid:
<?php
str_replace
($search, $replace, $subject, 1);
?>
At a glance it appears to be a reasonable request, until you realize that the fourth parameter must be a variable in order to be passed as a reference. A replacement:
<?php
str_replace
($search, $replace, $subject, $temp = 1);
// or
$temp = 1;
str_replace($search, $replace, $subject, $temp);
?>
cc at cc dot com 31-Mar-2012 05:26
I found a pretty low tech solution to avoid the "gotcha" without worrying about the array order of how things are replaced. I could not "order" the replacement array easily because it was being read from a database table.

Anyway if you add an identifiable token to each replaced word, then just filter this out at the very end, no nested search terms are found. I just dynamically add the %% after the first char of each word before pumping it into the str_ireplace function.

$find = array("as1", "as2", "as3", "flex");
$replace = array("<a href = \"#as1\">A%%uto S%%entry R%%ev. A%%</a>", "<a href = \"#as2\">A%%uto S%%entry E%%xp</a>", "<a href = \"#as3\">A%%uto S%%entry f%%lex</a>", "<a style = \"color: red;\" href = \"#flex\">f%%lex</a>");
$text = str_ireplace($find, $replace, $text);
echo str_ireplace("%%", "", $text);

In this case I am using %% as my token as this is an unlikely char combo for me.
moostende at gmail dot com 26-Sep-2011 11:20
Note that this does not replace strings that become part of replacement strings. This may be a problem when you want to remove multiple instances of the same repetative pattern, several times in a row.

If you want to remove all dashes but one from the string '-aaa----b-c-----d--e---f' resulting in '-aaa-b-c-d-e-f', you cannot use str_replace. Instead, use preg_replace:

<?php
$challenge
= '-aaa----b-c-----d--e---f';
echo
str_replace('--', '-', $challenge).'<br>';
echo
preg_replace('/--+/', '-', $challenge).'<br>';
?>

This outputs the following:
-aaa--b-c---d-e--f
-aaa-b-c-d-e-f
mbullard at accuvista dot co dot uk 14-Jul-2011 02:42
Insert space after comma.

If you have a form that stores results in a database field as comma separated values, when you display this data you can use the following to insert a space after each comma:

<?php
$find
[] = ',';
$replace[] = '&#44;&nbsp;';
$text = str_replace($find, $replace, $row_rsRecordset['Field']);
print_r($text);
?>

Notes:
1) To get round the Replacement Order Gotcha, the comma is also replaced with its code equivalent: &#44;
2) You can adapt the $replace section to suit your needs: swap out the &nbsp; code with <br/> or replace comma and space with &nbsp;&middot;&nbsp; etc.
hakre 06-Jul-2011 08:08
I was looking for a str_replace function supporting callbacks. As I didn't found one I wrote one my own. Works exactly like str_replace, but the replace parameter is a callback or an array of callbacks (instead of string/strings in str_replace). The callback function accepts two arguments, the string that is being replaced and the count of the replacement being done.

<?php
/**
 * str_ureplace
 *
 * str_replace like function with callback
 *
 * @param string|array search
 * @param callback|array $replace
 * @param string|array $subject
 * @param int $replace_count
 * @return string|array subject with replaces, FALSE on error.
 */
function str_ureplace($search, $replace, $subject, &$replace_count = null) {
   
$replace_count = 0;
   
   
// validate input
   
$search = array_values((array) $search);
   
$searchCount = count($search);
    if (!
$searchCount) {
        return
$subject;
    }
    foreach(
$search as &$v) {
       
$v = (string) $v;
    }
    unset(
$v);
   
$replaceSingle = is_callable($replace);   
   
$replace = $replaceSingle ? array($replace) : array_values((array) $replace);
    foreach(
$replace as $index=>$callback) {
        if (!
is_callable($callback)) {
            throw new
Exception(sprintf('Unable to use %s (#%d) as a callback', gettype($callback), $index));
        }
    }
   
   
// search and replace
   
$subjectIsString = is_string($subject);
   
$subject = (array) $subject;
    foreach(
$subject as &$haystack) {
        if (!
is_string($haystack)) continue;
        foreach(
$search as $key => $needle) {
            if (!
$len = strlen($needle))
                continue;           
           
$replaceSingle && $key = 0;           
           
$pos = 0;
            while(
false !== $pos = strpos($haystack, $needle, $pos)) {
               
$replaceWith = isset($replace[$key]) ? call_user_func($replace[$key], $needle, ++$replace_count) : '';
               
$haystack = substr_replace($haystack, $replaceWith, $pos, $len);
            }
        }
    }
    unset(
$haystack);
   
    return
$subjectIsString ? reset($subject) : $subject;
}
?>
jay_knows_(all)uk at hotmail dot com 16-Feb-2011 07:16
This strips out horrible MS word characters.

Just keep fine tuning it until you get what you need, you'll see ive commented some out which caused problems for me.

There could be some that need adding in, but its a start to anyone who wishes to make their own custom function.

<?php

function msword_conversion($str)
{
$str = str_replace(chr(130), ',', $str);    // baseline single quote
$str = str_replace(chr(131), 'NLG', $str);  // florin
$str = str_replace(chr(132), '"', $str);    // baseline double quote
$str = str_replace(chr(133), '...', $str);  // ellipsis
$str = str_replace(chr(134), '**', $str);   // dagger (a second footnote)
$str = str_replace(chr(135), '***', $str);  // double dagger (a third footnote)
$str = str_replace(chr(136), '^', $str);    // circumflex accent
$str = str_replace(chr(137), 'o/oo', $str); // permile
$str = str_replace(chr(138), 'Sh', $str);   // S Hacek
$str = str_replace(chr(139), '<', $str);    // left single guillemet
// $str = str_replace(chr(140), 'OE', $str);   // OE ligature
$str = str_replace(chr(145), "'", $str);    // left single quote
$str = str_replace(chr(146), "'", $str);    // right single quote
// $str = str_replace(chr(147), '"', $str);    // left double quote
// $str = str_replace(chr(148), '"', $str);    // right double quote
$str = str_replace(chr(149), '-', $str);    // bullet
$str = str_replace(chr(150), '--', $str);    // endash
$str = str_replace(chr(151), '--', $str);   // emdash
// $str = str_replace(chr(152), '~', $str);    // tilde accent
// $str = str_replace(chr(153), '(TM)', $str); // trademark ligature
$str = str_replace(chr(154), 'sh', $str);   // s Hacek
$str = str_replace(chr(155), '>', $str);    // right single guillemet
// $str = str_replace(chr(156), 'oe', $str);   // oe ligature
$str = str_replace(chr(159), 'Y', $str);    // Y Dieresis
$str = str_replace('¡ãC', '&deg;C', $str);    // Celcius is used quite a lot so it makes sense to add this in
$str = str_replace('¡ê', '&pound;', $str);
$str = str_replace("'", "'", $str);
$str = str_replace('"', '"', $str);
$str = str_replace('-', '&ndash;', $str);

return
$str;
}

?>
mevdschee 29-Jan-2011 03:19
say you want every "a" replaced by "abba" and every "b" replaced by "baab" in the string "ab" you do:

<?php
$search
= array("a","b");
$replace = array("abba","baab");
echo
str_replace($search,$replace,"ab");
?>

that results in "abaabbaababaab" and not the expected "abbabaab"

I wrote this little snippet to solve the replacements-in-replacement problem:

<?php
function search_replace($s,$r,$sql)
{
$e = '/('.implode('|',array_map('preg_quote', $s)).')/';
 
$r = array_combine($s,$r);
  return
preg_replace_callback($e, function($v) use ($s,$r) { return $r[$v[1]]; },$sql);
}

echo
search_replace($search,$replace,"ab");
?>

that results in the expected "abbabaab"
nikolaz dot tang at hotmail dot com 11-Nov-2010 08:57
A faster way to replace the strings in multidimensional array is to json_encode() it, do the str_replace() and then json_decode() it, like this:

<?php
function str_replace_json($search, $replace, $subject){
     return
json_decode(str_replace($search, $replacejson_encode($subject)));

}
?>

This method is almost 3x faster (in 10000 runs.) than using recursive calling and looping method, and 10x simpler in coding.

Compared to:

<?php
function str_replace_deep($search, $replace, $subject)
{
    if (
is_array($subject))
    {
        foreach(
$subject as &$oneSubject)
           
$oneSubject = str_replace_deep($search, $replace, $oneSubject);
        unset(
$oneSubject);
        return
$subject;
    } else {
        return
str_replace($search, $replace, $subject);
    }
}
?>
apmuthu at usa dot net 19-Jun-2010 12:31
If we have a html template that contains placeholders in curly braces that need to be replaced in runtime, the following function will do it using str_replace:

<?php

function parse_template($filename, $data) {
// example template variables {a} and {bc}
// example $data array
// $data = Array("a" => 'one', "bc" => 'two');
   
$q = file_get_contents($filename);
    foreach (
$data as $key => $value) {
       
$q = str_replace('{'.$key.'}', $value, $q);
    }
    return
$q;
}

?>
cableray 11-Jun-2010 12:03
If you wish to get around the 'gotcha', you could do something like this:

<?php

$find
=array('a', 'p', '^', '*');
$replace = array('^', '*', 'apple', 'pear');
str_replace($find, $replace, 'a p');

?>

The idea here is that you first replace the items you want with unique identifiers (that you are unlikely to find in the subject) and then search for those identifiers and then replace them.
christian dot reinecke at web dot de 14-May-2010 12:06
If you need to replace a string in another, but only once but still in all possible combinations (f.e. to replace "a" with "x" in "aba" to get array("xba", "abx")) you can use this function:
<?php
function getSingleReplaceCombinations($replace, $with, $inHaystack)
{
   
$splits = explode($replace, $inHaystack);
   
$result = array();
    for (
$i = 1, $ix = count($splits); $i < $ix; ++$i) {
       
$previous = array_slice($splits, 0, $i);
       
$next     = array_slice($splits, $i);
       
       
$combine  = array_pop($previous) . $with . array_shift($next);
       
$result[] = implode($replace, array_merge($previous, array($combine), $next));
    }
    return
$result;
}
var_dump(getSingleReplaceCombinations("a", "x", "aba")); // result as mentioned above
?>
It may not be the best in performance, but it works.
jbarnett at jmbelite dot com 26-Apr-2010 01:23
Might be worth mentioning that a SIMPLE way to accomplish Example 2 (potential gotchas) is to simply start your "replacements" in reverse.

So instead of starting from "A" and ending with "E":

<?php
$search 
= array('A', 'B', 'C', 'D', 'E');
$replace = array('B', 'C', 'D', 'E', 'F');
// replaces A to B, B to C, C to D, D to E, E to F (makes them all F)
// start from "E" and end with "A":

$search  = array('E', 'D', 'C', 'B', 'A');
$replace = array('F', 'E', 'D', 'C', 'B');
// replaces E to F, D to E, C to D, B to C, A to B (prevents from
// multiple replacements of already replaced values)
?>

So basically start from the "end" and put the replacements in an order where the "replaced value" won't equal a value that exists later in the "search array".
pjcdawkins at googlemail dot com 23-Apr-2010 05:23
Here's a deep replace function allowing multi-dimensional arrays in $search, $replace and $subject. The keys and other structure of $subject are preserved.

<?php
// Auxiliary function:
function _replaceWithAnything($search,$replace,$subject){
  if(!
is_array($search) || !is_array($replace)){
   
$search=array($search);
   
$replace=array($replace);
  }
 
$match=array_search($subject,$search,true);
  if(
$match!==false && array_key_exists($match,$replace))
   
$subject=$replace[$match];
  return
$subject;
}

// Main function:
function deepReplace($search,$replace,$subject){
  if(!
is_array($subject))
    return
_replaceWithAnything($search,$replace,$subject);
  foreach(
$subject as &$val){
    if(
is_array($val)){
     
$val=deepReplace($search,$replace,$val);
      continue;
    }
   
$val=_replaceWithAnything($search,$replace,$val);
  }
  return
$subject;
}
?>
fleshgrinder at gmx dot at 16-Apr-2010 05:50
Fast function to replace new lines from a given string. This is interesting to replace all new lines from e. g. a text formatted in HTML retrieved from database and printing it without the unnecessary new lines. This results in slightly faster rendering in the Web browser.

<?php

/**
 * Replace all linebreaks with one whitespace.
 *
 * @access public
 * @param string $string
 *   The text to be processed.
 * @return string
 *   The given text without any linebreaks.
 */
function replace_newline($string) {
  return (string)
str_replace(array("\r", "\r\n", "\n"), '', $string);
}

?>
Wes Foster 17-Dec-2009 01:32
Feel free to optimize this using the while/for or anything else, but this is a bit of code that allows you to replace strings found in an associative array.

For example:
<?php
$replace
= array(
'dog' => 'cat',
'apple' => 'orange'
'chevy'
=> 'ford'
);

$string = 'I like to eat an apple with my dog in my chevy';

echo
str_replace_assoc($replace,$string);

// Echo: I like to eat an orange with my cat in my ford
?>

Here is the function:

<?php
function strReplaceAssoc(array $replace, $subject) {
   return
str_replace(array_keys($replace), array_values($replace), $subject);   
}
?>

[Jun 1st, 2010 - EDIT BY thiago AT php DOT net: Function has been replaced with an updated version sent by ljelinek AT gmail DOT com]
Decko 15-Oct-2009 01:41
As mentioned earlier you should take the order into account when substituting multiple values.

However it is worth noticing that str_replace doesn't seem to re-read the string when doing single replacements. Take the following example.

<?php
  $s
= '/a/a/';
 
$s = str_replace('/a/', '/', $s);
?>

You would expect the following.

First replacement '/a/a/' -> '/a/'
Second replacement '/a/'->'/'

This is not the case, the actual result will be '/a/'.

To fix this, you will have to put str_replace in a while-loop.

<?php
  $s
= '/a/a/';
  while(
strpos($s, '/a/') !== false)
   
$s = str_replace('/a/', '/', $s); //eventually $s will == '/'
?>
Alberto Lepe 15-Jun-2009 07:44
Be careful when replacing characters (or repeated patterns in the FROM and TO arrays):

For example:

<?php
$arrFrom
= array("1","2","3","B");
$arrTo = array("A","B","C","D");
$word = "ZBB2";
echo
str_replace($arrFrom, $arrTo, $word);
?>

I would expect as result: "ZDDB"
However, this return: "ZDDD"
(Because B = D according to our array)

To make this work, use "strtr" instead:

<?php
$arr
= array("1" => "A","2" => "B","3" => "C","B" => "D");
$word = "ZBB2";
echo
strtr($word,$arr);
?>

This returns: "ZDDB"
moz667 at gmail dot com 21-May-2009 09:49
<?php
/*
This is a function for made recursive str_replaces in an array
*/
function recursive_array_replace($find, $replace, &$data) {
    if (
is_array($data)) {
        foreach (
$data as $key => $value) {
            if (
is_array($value)) {
               
recursive_array_replace($find, $replace, $data[$key]);
            } else {
               
$data[$key] = str_replace($find, $replace, $value);
            }
        }
    } else {
       
$data = str_replace($find, $replace, $data);
    }
}

$a = array();
$a['a'] = "a";
$a['b']['a'] = "ba";
$a['b']['b'] = "bb";
$a['c'] = "c";
$a['d']['a'] = "da";
$a['d']['b'] = "db";
$a['d']['c'] = "dc";
$a['d']['d'] = "dd";

echo
"Before Replaces";
print_r($a);

recursive_array_replace("a", "XXXX", $a);

echo
"After Replaces";
print_r($a);
?>
michael dot moussa at gmail dot com 29-Jan-2009 06:38
As previous commentators mentioned, when $search contains values that occur earlier in $replace, str_replace will factor those previous replacements into the process rather than operating solely on the original string.  This may produce unexpected output.

Example:

<?php
$search
= array('A', 'B', 'C', 'D', 'E');
$replace = array('B', 'C', 'D', 'E', 'F');
$subject = 'ABCDE';

echo
str_replace($search, $replace, $subject); // output: 'FFFFFF'
?>

In the above code, the $search and $replace should replace each occurrence in the $subject with the next letter in the alphabet.  The expected output for this sample is 'BCDEF'; however, the actual output is 'FFFFF'.

To more clearly illustrate this, consider the following example:

<?php
$search
= array('A', 'B', 'C', 'D', 'E');
$replace = array('B', 'C', 'D', 'E', 'F');
$subject = 'A';

echo
str_replace($search, $replace, $subject); // output: 'F'
?>

Since 'A' is the only letter in the $search array that appears in $subject, one would expect the result to be 'B'; however, replacement number $n does *not* operate on $subject, it operates on $subject after the previous $n-1 replacements have been completed.

The following function utilizes array_combine and strtr to produce the expected output, and I believe it is the most efficient way to perform the desired string replacement without prior replacements affecting the final result.

<?php
/**
* When using str_replace(...), values that did not exist in the original string (but were put there by previous
* replacements) will be replaced continuously.  This string replacement function is designed replace the values
* in $search with those in $replace while not factoring in prior replacements.  Note that this function will
* always look for the longest possible match first and then work its way down to individual characters.
*
* The "o" in "stro_replace" represents "original", indicating that the function operates only on the original string.
*
* @param array $search list of strings or characters that need to be replaced
* @param array $replace list of strings or characters that will replace the corresponding values in $search
* @param string $subject the string on which this operation is being performed
*
* @return string $subject with all substrings in the $search array replaced by the values in the $replace array
*/
function stro_replace($search, $replace, $subject)
{
    return
strtr( $subject, array_combine($search, $replace) );
}

$search = array('A', 'B', 'C', 'D', 'E');
$replace = array('B', 'C', 'D', 'E', 'F');
$subject = 'ABCDE';

echo
stro_replace($search, $replace, $subject); // output: 'BCDEF'
?>

Some other examples:

<?php
$search
= array(' ', '&');
$replace = array('&nbsp;', '&amp;');
$subject = 'Hello & goodbye!';

// We want to replace the spaces with &nbsp; and the ampersand with &amp;
echo str_replace($search, $replace, $subject); // output: "Hello&amp;nbsp&amp;&amp;nbspgoodbye!" - wrong!

echo stro_replace($search, $replace, $subject); // output: "Hello&nbsp;&amp;&nbsp;goodbye!" - correct!

/*
    Note:  Run the above code in the CLI or view source on your web browser - the replacement strings for stro_replace are HTML entities which the browser interprets.
*/
?>

<?php
$search
= array('ERICA', 'AMERICA');
$replace = array('JON', 'PHP');
$subject = 'MIKE AND ERICA LIKE AMERICA';

// We want to replace the name "ERICA" with "JON" and the word "AMERICA" with "PHP"
echo str_replace($search, $replace, $subject); // output: "MIKE AND JON LIKE AMJON", which is not correct

echo stro_replace($search, $replace, $subject); // output: "MIKE AND JON LIKE PHP", which is correct
?>
nospam at nospam dot com 02-Dec-2008 02:55
Replacement for str_replace in which a multiarray of numerically keyed data can be properly evaluated with the given template without having a search for 11 be mistaken for two 1's next to each other

<?php

function data_template($input, $template) {
  if (
$template) { // template string
   
if ($split = str_split($template)) { // each char as array member
     
foreach ($split as $char) { // each character
       
if (is_numeric($char)) { // test for digit
         
if ($s != 1) { // new digit sequence
           
$i++;
           
$s = 1;
          }
         
$digits[$i] .= $char; // store digit
       
} else { // not a digit
         
if ($s != 2) { // new non-digit sequence
           
$i++;
           
$s = 2;
          }
         
$strings[$i] .= $char; // store string
       
}
      }
      if (
$i && $input && is_array($input)) { // input data
       
foreach ($input as $sub) { // each subarray
         
if (is_array($sub)) {
           
$out = ''; // reset output
           
for ($j = 0; $j <= $i; $j++) { // each number/string member
             
if ($number = $digits[$j]) { // number
               
$out .= $sub[$number]; // add value from subarray to output
             
} else { // string
               
$out .= $strings[$j]; // add to output
             
}
            }
           
$a[] = $out;
          }
        }
        return
$a;
      }
// input
   
} // split
 
} // template
}

$input = array(array(1=>'yellow', 2=>'banana', 11=>'fruit'), array(1=>'green', 2=>'spinach', 11=>'vegetable'), array(1=>'pink', 2=>'salmon', 11=>'fish'));

print_r (data_template($input, '2: a 1, healthy 11'));

/*
Array
(
    [0] => banana: a yellow, healthy fruit
    [1] => spinach: a green, healthy vegetable
    [2] => salmon: a pink, healthy fish
)
*/

// str_replace would have wanted to output 'banana: a yellow, healthy yellowyellow

?>

Not sure if this will help anyone but I wrote it for my application and thought I would share just in case
nick at NOSPAM dot pitchinteractive dot com 06-Oct-2008 04:12
I tried max at efoxdesigns dot com solution for str_replace_once but it didn't work quite right so I came up with this solution (all params must be strings):

<?php
function str_replace_once($search, $replace, $subject) {
   
$firstChar = strpos($subject, $search);
    if(
$firstChar !== false) {
       
$beforeStr = substr($subject,0,$firstChar);
       
$afterStr = substr($subject, $firstChar + strlen($search));
        return
$beforeStr.$replace.$afterStr;
    } else {
        return
$subject;
    }
}
?>
paolo A T doppioclick D O T com 05-Sep-2008 04:15
For PHP 4 < 4.4.5 and PHP 5 < 5.2.1 you may occur (like me) in this bug:

http://www.php-security.org/MOPB/MOPB-39-2007.html
troy at troyonline dot com 22-Jun-2008 10:18
Yet another deep replace function:

<?php
   
function str_replace_deep( $search, $replace, $subject)
    {
       
$subject = str_replace( $search, $replace, $subject);

        foreach (
$subject as &$value)
           
is_array( $value) and $value =str_replace_deep( $search, $replace, $value);
           
        return
$subject;
    }
?>
David Gimeno i Ayuso (info at sima dot cat) 09-Aug-2007 12:22
With PHP 4.3.1, at least, str_replace works fine when working with single arrays but mess it all with two or more dimension arrays.

<?php
$subject
= array("You should eat this","this","and this every day.");
$search  = "this";
$replace = "that";
$new     = str_replace($search, $replace, $subject);

print_r($new); // Array ( [0] => You should eat that [1] => that [2] => and that every day. )

echo "<hr />";

$subject = array(array("first", "You should eat this")
                ,array(
"second","this")
                ,array(
"third", "and this every day."));
$search  = "this";
$replace = "that";
$new     = str_replace($search, $replace, $subject);

print_r($new); // Array ( [0] => Array [1] => Array [2] => Array )

?>
kole 25-Feb-2007 05:48
My input is MS Excel file but I want to save ',',"," as ',',",".

    $badchr        = array(
        "\xc2", // prefix 1
        "\x80", // prefix 2
        "\x98", // single quote opening
        "\x99", // single quote closing
        "\x8c", // double quote opening
        "\x9d"  // double quote closing
    );
       
    $goodchr    = array('', '', '\'', '\'', '"', '"');
       
    str_replace($badchr, $goodchr, $strFromExcelFile);

Works for me.
15-Jan-2007 01:42
Before spending hours searching your application why it makes UTF-8 encoding into some malformed something with str_replace, make sure you save your PHP file in UTF-8 (NO BOM).

This was at least one of my problems.
matt wheaton 30-Mar-2006 07:40
As an effort to remove those Word copy and paste smart quotes, I've found that this works with UTF8 encoded strings (where $text in the following example is UTF8). Also the elipsis and em and en dashes are replaced.

There is an "invisible" character after the a€ for the right side double smart quote that doesn't seem to display here. It is chr(157).

<?php
  $find
[] = 'a€?'// left side double smart quote
 
$find[] = 'a€?'// right side double smart quote
 
$find[] = 'a€?'// left side single smart quote
 
$find[] = 'a€™'// right side single smart quote
 
$find[] = 'a€|'// elipsis
 
$find[] = 'a€"'// em dash
 
$find[] = 'a€"'// en dash

 
$replace[] = '"';
 
$replace[] = '"';
 
$replace[] = "'";
 
$replace[] = "'";
 
$replace[] = "...";
 
$replace[] = "-";
 
$replace[] = "-";

 
$text = str_replace($find, $replace, $text);
?>