2012-09-12 55 views
0

我在使用數組時遇到preg_replace()問題。preg_replace與兩個陣列

基本上,我想轉置這個字符串;

$string = "Dm F Bb F Am"; 

$New_string = "F#m D D A C#m"; 

這裏是我做的:

$Find = Array("/Dm/", "/F/", "/Bb/", "/Am/", "/Bbm/", "/A/", "/C/"); 
$Replace = Array('F#m', 'A', 'D', 'C#m', 'Dm', 'C#', 'E'); 
$New_string = preg_replace($Find, $Replace, $string); 

但我得到這樣的結果,而不是:

Ë##米,東#DE·E#m的

問題是每一場比賽都被替換爲以下,像這種情況發生(例如對於E ##米):

DM - > F#米 - > A#米 - >Ç##米 - >電子##米

是否有任何解決方案來簡單地將「Dm」改爲「F#m」,「F」改爲「A」等?

謝謝!

+2

看起來像一個簡單的'str_replace()'給我,沒有'preg'需要 – DaveRandom

+0

謝謝,但我已經嘗試過'str_replace()'和結果是完全一樣的,這是錯誤的... – SuN

+0

哦*對*你在得到什麼。一會兒會回答。 – DaveRandom

回答

4

你可以使用strtr()

<?php 
    $string = "Dm F Bb F Am"; 
    $Find = Array('Dm', 'F', 'Bb', 'Am', 'Bbm', 'A', 'C'); 
    $Replace = Array('F#m', 'A', 'D', 'C#m', 'Dm', 'C#', 'E'); 

    $New_string = strtr($string, array_combine($Find, $Replace)); 

    echo $New_string; 

    // F#m A D A C#m 
+0

非常感謝Mihai,它訣竅! – SuN

+0

更多,:) –

+2

啊,是的,我忘了你可以用螺絲刀代替錘子的螺絲。 +1 – DaveRandom

1

preg_replace_callback()大概是這樣做的最簡單的方法,你需要做的是在一個單一的操作。事情是這樣的:

<?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

現在,我知道上面的代碼是有點難以理解,讓我們把它分解一下,看看各個組成部分的作用:

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