2012-11-29 68 views
1

爲什麼會變成這樣的代碼的Preg替換的模式陣列無法按預期工作

$my_replacements = array("my dog", "doga"); 
$my_string = "doga my dog test"; 
$my_patterns = array_map(function($my_text) { return "/(^|[\n\r\f\t \.\,])" . trim($my_text) . "([\n\r\f\t \.\,]|$)/iu"; }, $my_replacements); 
$replaced_string = preg_replace($my_patterns, '', $my_string); 
echo $replaced_string; 

回報dogatest,而不是test

但是,如果my_string更改爲"my dog doga test",它會正確替換my_replacements中的兩個元素嗎?

我想完成的是,給定一個字符串,找到$ my_replacements中的所有字符串,並從字符串中刪除它們。考慮到/ u修飾符和/ i修飾符或preg_replace,因爲可能發生子字符串大寫,並且必須以任一方式刪除它。

+0

可以請你做一個print_r的my_patterns數組嗎? '$ my_text'有什麼價值? – Naryl

回答

2

因爲你替換轉化以下的正則表達式:

/(^|[\n\r\f\t \.\,])my dog([\n\r\f\t \.\,]|$)/iu 
/(^|[\n\r\f\t \.\,])doga([\n\r\f\t \.\,]|$)/iu 

後第一個正則表達式應用到源字符串"my dog doga test" - 它切斷了dog doga與周圍空間。所以你得到dogatest

之後,第二個正則表達式不能匹配任何東西,因爲它期望doga被字符串的開頭或結尾,空格或標點符號包圍。但在你的情況下,它在字符串的開頭(true),但沒有空格,標點符號或字符串結尾(false)。

這就是爲什麼第二個正則表達式不會修改字符串,並將dogatest作爲最終結果。

沒有正則表達式簡單的解決方案:

$my_replacements = array("my dog", "doga"); 
$my_string = "doga my dog test"; 
$replaced_string = str_replace($my_replacements, '', $my_string); 
echo $replaced_string; 

那種@Asad創建腳本的鍵盤演示:http://codepad.org/ywbZR1i8

+0

哦!那麼,我怎麼能解決這個問題呢?爲什麼我的替換變成了這個?我基本上想找到任何字符在我的字符串中的替換... –

+0

@Hommer史密斯:因爲**你**這樣做代碼 - '$ my_patterns = array_map(函數($ my_text){返回「/ (^ | [\ n \ r \ f \ t \。\,])「。trim($ my_text)。」([\ n \ r \ f \ t \。\,] | $)/ iu「;} ,$ my_replacements);' – zerkms

+0

zerkms,我試圖找到解決方案。什麼是一個好的方法,所以我可以嘗試找到我的數組中的所有替換字符串中的? –

1

有你爲什麼不使用str_replace函數理由嗎? 如果是的話,你可以使用
$my_replacements = array("doga", "my dog");
代替
$my_replacements = array("my dog", "doga");

原因:「多加」在你的字符串替換「」後,這將成爲「dogatest」。所以,帶空格的doga(就像你定義的常規exp一樣)不在那裏。您也可以使用「」替換「」,
$replaced_string = preg_replace($my_patterns, ' ', $my_string);
然後用一個空格(簡單遞歸替換)修剪和替換所有多個空格。