2012-04-27 39 views
1

可以說我有不好的話數組:preg_match字符串中的數組項?

$badwords = array("one", "two", "three"); 

和隨機字符串:

$string = "some variable text"; 

如何創建這個循環:

if (one or more items from the $badwords array is found in $string) 
echo "sorry bad word found"; 
else 
echo "string contains no bad words"; 

例如:
如果$string = "one fine day" or "one fine day two of us did something",用戶應該看到對不起壞字發現的消息。
如果$string = "fine day",用戶應該看到字符串包含沒有不良詞的消息。我知道,你不能preg_match從數組。任何建議?

+0

$ string是百達一個隨機字符串,它的搜索查詢更具體的。所以如果訪問者輸入包含不好的單詞的查詢,他應該看不到任何結果,否則..那麼你明白了嗎? :) – DadaB 2012-04-27 22:00:35

+0

和**是的,你可以'preg_match' **一個數組,你只需要先崩潰它。檢查我給出的答案。 – 2012-04-28 00:29:12

回答

5

如何:

$badWords = array('one', 'two', 'three'); 
$stringToCheck = 'some stringy thing'; 
// $stringToCheck = 'one stringy thing'; 

$noBadWordsFound = true; 
foreach ($badWords as $badWord) { 
    if (preg_match("/\b$badWord\b/", $stringToCheck)) { 
    $noBadWordsFound = false; 
    break; 
    } 
} 
if ($noBadWordsFound) { ... } else { ... } 
+0

就像一個魅力。非常感謝! – DadaB 2012-04-28 13:36:50

+0

我用你的代碼阿拉伯文字符串,它工作正常。第二天,我試圖運行代碼沒有任何修改,但給了我錯誤的結果。問題出在preg_match函數中。請幫忙嗎? – Fshamri 2015-09-20 20:54:36

2

如果您想通過爆炸串入的話,檢查每個單詞,你可以使用這個:

$badwordsfound = count(array_filter(
    explode(" ",$string), 
    function ($element) use ($badwords) { 
     if(in_array($element,$badwords)) 
      return true; 
     } 
    })) > 0; 

if($badwordsfound){ 
    echo "Bad words found"; 
}else{ 
    echo "String clean"; 
} 

現在,更好的東西來到我的腦海裏,如何更換數組中的所有不良詞並檢查該字符串是否保持不變?

$badwords_replace = array_fill(0,count($badwords),""); 
$string_clean = str_replace($badwords,$badwords_replace,$string); 
if($string_clean == $string) { 
    echo "no bad words found"; 
}else{ 
    echo "bad words found"; 
} 
+1

我建議在'\ b'之類的東西上進行分割,否則當逗號或其他分隔符跟隨時,不好的單詞會運行。) – raina77ow 2012-04-27 22:17:26

+0

嘿看看我接受之前添加的第二個解決方案:D – 2012-04-27 22:21:28

+0

使用此解決方案時要小心「clbuttic錯誤」。 – 2012-04-27 22:39:42

1

這裏是壞詞過濾器我使用和它的偉大工程:

private static $bad_name = array("word1", "word2", "word3"); 

// This will check for exact words only. so "ass" will be found and flagged 
// but not "classic" 

$badFound = preg_match("/\b(" . implode(self::$bad_name,"|") . ")\b/i", $name_in); 

然後,我有選擇的字符串另一個變量匹配:

// This will match "ass" as well as "classic" and flag it 

private static $forbidden_name = array("word1", "word2", "word3"); 

$forbiddenFound = preg_match("/(" . implode(self::$forbidden_name,"|") . ")/i", $name_in); 

然後我運行一個if對此:

if ($badFound) { 
    return FALSE; 
} elseif ($forbiddenFound) { 
    return FALSE; 
} else { 
    return TRUE; 
} 

希望這有助於。詢問你是否需要我澄清任何事情。

5

爲什麼要在這裏使用preg_match()
這個怎麼樣:

foreach($badwords as $badword) 
{ 
    if (strpos($string, $badword) !== false) 
    echo "sorry bad word found"; 
    else 
    echo "string contains no bad words"; 
} 

如果您需要preg_match()因爲某些原因,你可以動態地生成正則表達式。事情是這樣的:

$pattern = '/(' . implode('|', $badwords) . ')/'; // $pattern = /(one|two|three)/ 
$result = preg_match($pattern, $string); 

HTH