2012-04-27 8 views
1

私は悪い言葉の配列を考えてみましょう:、
$string = "one fine day" or "one fine day two of us did something"場合: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 = "fine day"の場合、文字列には悪い単語のメッセージが含まれていないはずです。

私が知っている通り、配列からpreg_matchを入力することはできません。どんなアドバイスですか?

+0

$文字列はオールウェイズランダムな文字列、具体的には、その検索クエリです。だから、訪問者が悪い言葉を含む質問を入力した場合、彼は結果を見なければならない、そうでなければ..あなたはポイントを得た? :) – DadaB

+0

**配列を 'preg_match' **することができます。まず配列を先取りする必要があります。私の答えを確認してください。 –

答えて

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

+0

私はあなたのコードをアラビア文字列に使用しました。次の日、私はコードを変更せずに実行しようとしましたが、間違った結果をもたらします。問題はpreg_match関数にあります。助けてください? – Fshamri

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

+0

私が受け入れる前に追加した2番目の解決策をご覧ください.D –

+0

この解決策では "clbuttic mistake"に注意してください。 –

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()を使用しますか?あなたには、いくつかの理由でpreg_match()が必要な場合は

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

、あなたは動的正規表現パターンを生成することができます。これについてどう
。このような何か:

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

HTH

関連する問題