2012-09-20 126 views
0

這裏的話使用的preg_replace是我的源從文件不能正常工作

$Message = $_GET["message"]; 
$Username = htmlspecialchars($_GET["username"]); 
$unix = ($_GET["time"]); 
include 'mcheck.php'; 
$file1 = file_get_contents('filter.txt'); 
$bad_words = explode(PHP_EOL, $file1); 
$compare = explode('', $Message); 
foreach ($bad_words as $bad_word) 
    $Message = preg_replace('/\b('.$bad_word.')\b/i', "***", $Message); 
    echo $Message; 

說壞的詞是go

$Message = I Like to go to school

我希望它echo I Like to *** to school

而是IM獲得

***I***Like***To******to***school*** 

我不知道問題是什麼

+2

嗯,這裏是你的[示例](http://codepad.org/nMu3uBhl),它的工作原理很好,所以我認爲你的'$ bad_words'不是你對它們的看法。 ) – raina77ow

回答

3

你的文件最有可能以新行結束(這是一件好事:在* nix系統中的所有文本文件都應該),這意味着explode(PHP_EOL, $file1)的最後一個元素是空的(這是最後的換行符之間的一切,該文件的結尾,這是什麼)。我建議寫:

$file1 = trim(file_get_contents('filter.txt')); 

使用the trim function,以消除去年換行符。

+0

你的我的英雄。 – Ron

6

根據輸出,您的陣列中可能有一個空元素。所以它最終匹配一個字邊界(\b)。

爲了證實這一點添加如下調試代碼:

$bad_words = explode(PHP_EOL, $file1); 
print_r($bad_words); 

順便說一句,這是一種浪費循環每個壞詞。一旦你解決了上述問題,我建議使用一個包含修改的正則表達式。

例如:

\b(one|two|three)\b 
+0

因此,它匹配邊界詞?,我不希望它拿起去的話,像樂高。 – Ron

+0

詞邊界很好,這是空的捕獲是問題。 –

1

我想喲需要刪除空字段從爆炸產生的陣列

+0

你可以使用array_filter – ZiTAL

4

你爲什麼不只是使用str_replace

$badWords = array("go","school"); 
$message = " I like to go to school" ; 
$newMessage = str_replace($badWords, "***", $message); 
echo $newMessage ; 

輸出

I like to *** to *** 
+0

因爲不涉及正則表達式魔法,所以速度應該更快。 – clentfort

+3

是的,它將取代'去','去'和'arsegole'。那裏使用'preg_replace'是有原因的。 – raina77ow

+0

正是@ raina77ow。運行:'$ message ='他上學';'。不要在家裏試試這個孩子。 :) –

1

您應該爲此使用strtr

可以傳遞陣列密鑰=>取代,這將在一定程度上更高效,preg_replace函數

分開,必須是壞BADWORDS DIC。

+0

如上所述,'strtr'會匹配* go *,* goes *,* gone *等。因此正則表達式。 –

+0

因爲你需要替換不一定是壞情況的壞話;)但是同意正則表達式。 – jancha