2012-12-27 91 views
2
位置

更換比方說,我有這個字符串:的preg_replace或str_replace函數的PHP通過

$str = "alemylaife"; 

(我知道這是拼寫錯誤,我的一生)

現在,我怎麼更換

「ALE」而不會取代之後包含相同字母的「麥芽酒」?

比方說,我得到這個數組:

$replace = Array("a","l","e"); 
$with = Array("wh","at","ever"); 

$str = str_replace($replace,$with,$str); 
echo $str; 

會打印:

whatevermyatwhifever 

我怎麼能停下來 「麥酒」 後更換字母str_replace函數? 也許我需要修剪3個首字母,然後替換它們然後加入修剪過的字符串?

編輯:我要儘量表達自己更清楚。 我只想要三(3)個首字母被替換,如果它們包含A THEN L THEN任何字母,那麼ala ale al al aly。這些是我想要替換的字母。我不希望他們之後的信件受到影響。

+1

你在http://php.net/str_replace嘗試了更多花哨規則的建議嗎?你的問題也不清楚。在目前的形式中,我發現很多機會*技術上無法回答*因爲問題沒有明確定義(可能有多個答案,但您需要特定的答案,但不知道哪一個答案)。 – hakre

回答

2

問題不是很清楚。假設你想用「任何」代替「ale」(如果我錯了,就糾正我),那麼你可以使用preg_replace來限制替換次數。

實施例1:(替換 「ALE」 的第一次出現)

preg_replace("/ale/", "whatever", "alemylaife", 1) 
> whatevermylaife 

實施例2:(代替僅在字符串開始用 「ALE」)

preg_replace("/^ale/", "whatever", "alemylaife", 1) 
> whatevermylaife 

preg_replace("/^ale/", "whatever", "lolalemylaife", 1) 
> lolalemylaife 

編輯:您編輯您的問題提供更好的細節,我會用:

// match a string that begins with "al" and then a character (case in-sensitive) 
preg_replace("/^al[a-z]/i", "whatever", "alemylaife"); 
1

輸出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梨 出於同樣的原因,上述

$letters = array('a', 'p'); 
$fruit = array('apple', 'pear'); 
$text = 'a p'; 
$output = str_replace($letters, $fruit, $text); 
echo $output; 

,併爲進一步的參考檢查http://php.net/manual/en/function.str-replace.php

0

你有固定的搜索和替換提及?一臺機器無法知道你的意思是哪個ale字符串。

您可以擴大搜索範圍,直到您擁有唯一的匹配項,例如用all mpreg_replace代替alem,使用極限參數設置爲1.當然,這總是會代替第一次出現。

0

我真的不清楚你在這裏尋找哪種字符串函數。

$string = "alemylaife"; 

然後,你寫了字母"ale"。目前尚不清楚您是指序列"ale",還是您的意思是字母,任何順序,直到其中的每一個("a","e""l")都至少匹配一次。

這將是兩個完全不同的東西。讓我們第一個,它更容易:

// search for needle 

$needle = 'ale'; 
$pos = strpos($string, $needle); 

if (false === $pos) { 
    $before = ''; 
    $after = $string; 
} else { 
    $before = substr($string, 0, $pos); 
    $after = substr($string, $pos + strlen($needle)); 
} 

然後,您可以運行你想,然後串聯後的部分替代。

第二個變體需要更多的處理邏輯。可以通過找到每個角色的第一個位置來完成,然後最大的匹配就是位置。如果任何搜索失敗,則失敗。這將取代從第一個示例中str_pos調用,實際上它是那麼多次運行它:

// search for character group 

$group = str_split($needle); 

$pos = false; 
foreach (str_split($needle) as $character) { 
    $test = strpos($string, $character); 
    if (false === $test) { 
     $pos = false; 
     break; 
    } 
    $test += strlen($character); 
    if ($test >= $pos) { 
     $pos = $test; 
    } 
} 

最後,$pos包含的第一個字母是整個集團的最後一個匹配的字母的位置。