preg_replace_callback() is probably the simplest way of doing that, you need to do it in a single operation. Something like this:
<?php
$string = "Dm F Bb F Am";
$replacements = array (
'Dm' => 'F#m',
'F' => 'A',
'Bb' => 'D',
'Am' => 'C#m',
'Bbm' => 'Dm',
'A' => 'C#',
'C' => 'E'
);
$New_string = preg_replace_callback('/\b('.implode('|', array_map('preg_quote', array_keys($replacements), array_fill(0, count($replacements), '/'))).')\b/', function($match) use($replacements) {
return $replacements[$match[1]];
}, $string);
echo $New_string;
See it working
Now, I am aware that the code above is a little incomprehensible, so let's break it up a bit and see what each individual component does:
// The input string and a map of search => replace
$string = "Dm F Bb F Am";
$replacements = array (
'Dm' => 'F#m',
'F' => 'A',
'Bb' => 'D',
'Am' => 'C#m',
'Bbm' => 'Dm',
'A' => 'C#',
'C' => 'E'
);
// Get a list of the search strings only
$searches = array_keys($replacements);
// Fill an array with / characters to the same length as the number of search
// strings. This is required for preg_quote() to work properly
$delims = array_fill(0, count($searches), '/');
// Apply preg_quote() to each search string so it is safe to use in the regex
$quotedSearches = array_map('preg_quote', $searches, $delims);
// Build the regex
$expr = '/\b('.implode('|', $quotedSearches).')\b/';
// Define a callback that will translate search matches to replacements
$callback = function($match) use($replacements) {
return $replacements[$match[1]];
};
// Do the replacement
$New_string = preg_replace_callback($expr, $callback, $string);
str_replace()to me, nopregrequiredstr_replace()and the result is exactly the same, it's wrong...