2010-07-05 104 views
0

我在嘗試旋轉文章時需要幫助。我想查找文本並替換同義文本,同時保持大小寫不變。查找字符串並用相同大小寫字符串替換

例如,我有一個像一本字典:

招呼|喜|你好| howd'y

我需要找到所有hello並與hihowdy任何一個取代,或howd'y

假設我有一個句子:

喂,夥計們!當我說你嗨,你不應該打招呼嗎?

我的操作後,它會是這樣的:

嗨,夥計們!當我說你好時,你不應該對我說幾句嗎?

在這裏,我失去了這種情況。我想保持它!它應該是:

嗨,夥計們!當我說出HOWDY時,你不應該對我說多少?

我的字典大小是約5000線

招呼|喜|你好| howd'y去|來
工資|盈利|工資
不應該|不該
..

回答

1

我建議使用preg_replace_callback回調函數檢查匹配的單詞,看看是否(a)第一個字母沒有大寫,或(b)t他的第一個字母是唯一的大寫字母,或者(c)第一個字母不是唯一的大寫字母,然後根據需要替換爲正確修改的替換字。

+0

琥珀, 謝謝您的回答。我現在也相信我需要使用preg_replace和回調。我的str_ireplace將立即替換這個詞的所有實例!所以我不能保持適當的情況下不同的單詞! 但你提出的三個條件,在我的腦海裏早些時候:)。但是,因爲我沒有考慮回調函數,所以我的解決方案不會工作。所以你得到學分:)。 – HungryCoder 2010-07-05 19:44:45

0

你可以找到你的字符串,並做兩個測試:

$outputString = 'hi'; 
if ($foundString == ucfirst($foundString)) { 
    $outputString = ucfirst($outputString); 
} else if ($foundString == strtoupper($foundString)) { 
    $outputString = strtoupper($outputString); 
} else { 
    // do not modify string's case 
} 
+0

是的,這是我計劃要做的事情。但在HOW中可能會有所不同! :)。然而,你的意見肯定會有所幫助。非常感謝您的寶貴時間! – HungryCoder 2010-07-05 19:47:29

0

下面是保留的情況下(上,下或資本)的解決方案:

// Assumes $replace is already lowercase 
function convertCase($find, $replace) { 
    if (ctype_upper($find) === true) 
    return strtoupper($replace); 
    else if (ctype_upper($find[0]) === true) 
    return ucfirst($replace); 
    else 
    return $replace; 
} 

$find = 'hello'; 
$replace = 'hi'; 

// Find the word in all cases that it occurs in 
while (($pos = stripos($input, $find)) !== false) { 
    // Extract the word in its current case 
    $found = substr($input, $pos, strlen($find)); 

    // Replace all occurrences of this case 
    $input = str_replace($found, convertCase($found, $replace), $input); 
} 
+0

感謝您的輸入! – HungryCoder 2010-07-05 19:50:17

0

你可以試試下面的函數。請注意,它僅適用於ASCII字符串,因爲它使用了一些有用的properties of ASCII upper and lower case letters。然而,它應該是非常快:

function preserve_case($old, $new) { 
    $mask = strtoupper($old)^$old; 
    return strtoupper($new) | $mask . 
     str_repeat(substr($mask, -1), strlen($new) - strlen($old)); 
} 

echo preserve_case('Upper', 'lowercase'); 
// Lowercase 

echo preserve_case('HELLO', 'howdy'); 
// HOWDY 

echo preserve_case('lower case', 'UPPER CASE'); 
// upper case 

echo preserve_case('HELLO', "howd'y"); 
// HOWD'Y 

這是我的聰明的小Perl函數的PHP版本:

How do I substitute case insensitively on the LHS while preserving case on the RHS?

+0

非常感謝您的意見! – HungryCoder 2010-07-05 19:45:12

+0

我想我可以使用它!我的主題只有ASCII!所以不會成爲問題! – HungryCoder 2010-07-05 19:49:47

相關問題