0

配列に悪い単語の1つが見つかった場合にtrueを返すこの関数があります$stopwords

function stopWords($string, $stopwords) {
    $stopwords = explode(',', $stopwords);
    $pattern = '/\b(' . implode('|', $stopwords) . ')\b/i';
    if(preg_match($pattern, $string) > 0) {
       return true;
    }
    return false;
}

それはうまくいくようです。

問題は、配列$stopwordsが空の場合 (つまり、悪い単語が指定されていない)、空の値が悪い単語として認識され、常に true を返す場合のように、常に true を返すことです (問題はこれだと思いますが、別の問題かもしれません)。 )。

この問題を解決するのを手伝ってくれる人はいますか?

ありがとう

4

4 に答える 4

6

私は使用しますin_array()

function stopWords($string, $stopwords) {
   return in_array($string, explode(',',$stopwords));
}

これにより、正規表現の代わりに時間が節約されます。


編集:文字列内の任意の単語に一致する

function stopWords($string, $stopwords) {
   $wordsArray = explode(' ', $string);
   $stopwordsArray = explode(',',$stopwords);
   return count(array_intersect($wordsArray, $stopwordsArray)) < 1;
}
于 2012-02-07T11:53:28.367 に答える
0

配列$stopwordsが空の場合、はexplode(',', $stopwords)空の文字列と評価され、に$pattern等しくなり/\b( )\b/iます。$stopwordsこれが、が空の場合に関数がtrueを返す理由です。

ifこれを修正する最も簡単な方法は、配列が空かどうかを確認するステートメントを追加することです。

于 2012-02-07T12:04:53.900 に答える
0

$stopwords を配列として与える

function stopWords($string, $stopwords) {
    //Fail in safe mode, if $stopwords is no array
    if (!is_array($stopwords)) return true;
    //Empty $stopwords means all is OK
    if (sizeof($stopwords)<1) return false;
    ....
于 2012-02-07T11:55:03.537 に答える
-1

次のような条件を付けることができます。

if (!empty ($stopwords)) { your code} else {echo ("no bad words");}

次に、ユーザーまたはアプリケーションに悪い言葉を入力するように求めます。

于 2012-02-07T11:54:00.463 に答える