it-roy-ru.com

Проверьте, содержит ли строка слово в массиве

Это для страницы чата. У меня есть $string = "This dude is a mothertrucker". У меня есть массив плохих слов: $bads = array('truck', 'shot', etc). Как я могу проверить, содержит ли $string какое-либо из слов в $bad?
Пока у меня есть:

        foreach ($bads as $bad) {
        if (strpos($string,$bad) !== false) {
            //say NO!
        }
        else {
            // YES!            }
        }

За исключением случаев, когда я делаю это, когда пользователь вводит слово в списке $bads, вывод НЕТ! затем ДА! поэтому по какой-то причине код запускает его дважды.

13
user1879926
function contains($str, array $arr)
{
    foreach($arr as $a) {
        if (stripos($str,$a) !== false) return true;
    }
    return false;
}
57
Nirav Ranpara

1) Самый простой способ:

if ( in_array( 'eleven',  array("one", "four", "eleven", "six") ))
...

2) Другой способ (при проверке массивов в сторону других массивов):

$keywords=array('one','two','three');
$targets=array('eleven','six','two');
foreach ( $targets as $string ) 
{
  foreach ( $keywords as $keyword ) 
  {
    if ( strpos( $string, $keyword ) !== FALSE )
     { echo "The Word appeared !!" }
  }
}
10
T.Todua

можете ли вы попробовать это вместо своего кода

$string = "This dude is a mothertrucker";
$bads = array('truck', 'shot');
foreach($bads as $bad) {
    $place = strpos($string, $bad);
    if (!empty($place)) {
        echo 'Bad Word';
        exit;
    } else {
        echo "Good";
    }
}
9
Sanjay

Вы можете перевернуть свой неверный массив Word и сделать ту же проверку намного быстрее. Определите каждое плохое слово в качестве ключа массива. Например,

//define global variable that is available to too part of php script
//you don't want to redefine the array each time you call the function
//as a work around you may write a class if you don't want global variable
$GLOBALS['bad_words']= array('truck' => true, 'shot' => true);

function containsBadWord($str){
    //get rid of extra white spaces at the end and beginning of the string
    $str= trim($str);
    //replace multiple white spaces next to each other with single space.
    //So we don't have problem when we use explode on the string(we dont want empty elements in the array)
    $str= preg_replace('/\s+/', ' ', $str);

    $Word_list= explode(" ", $str);
    foreach($Word_list as $Word){
        if( isset($GLOBALS['bad_words'][$Word]) ){
            return true;
        }
    }
    return false;
}

$string = "This dude is a mothertrucker";

if ( !containsBadWord($string) ){
    //doesn't contain bad Word
}
else{
    //contains bad Word
}

В этом коде мы просто проверяем, существует ли индекс, а не сравниваем плохое слово со всеми словами в списке плохого слова.
isset намного быстрее, чем in_array, и немного быстрее, чем array_key_exists .
Убедитесь, что ни одно из значений в неверном массиве Word не установлено в нуль .
isset вернет false, если для индекса массива установлено значение null.

3
Abhijit Amin

Положи и выйди из игры или умри, когда найдешь плохие слова, как это

foreach ($bads as $bad) {
 if (strpos($string,$bad) !== false) {
        //say NO!
 }
 else {
        echo YES;
        die(); or exit;            
  }
}
2
Sanjay

Хотел это?

$string = "This dude is a mothertrucker"; 
$bads = array('truck', 'shot', 'mothertrucker');

    foreach ($bads as $bad) {
        if (strstr($string,$bad) !== false) {
            echo 'NO<br>';
        }
        else {
            echo 'YES<br>';
        }
    }
1
Lenin

Я бы пошел по этому пути, если строка чата не такая длинная.

$badwords = array('motherfucker', 'ass', 'hole');
$chatstr = 'This dude is a motherfucker';
$chatstrArr = explode(' ',$chatstr);
$badwordfound = false;
foreach ($chatstrArr as $k => $v) {
    if (in_array($v,$badwords)) {$badwordfound = true; break;}
    foreach($badwords as $kb => $vb) {
        if (strstr($v, $kb)) $badwordfound = true;
        break;
    }
}
if ($badwordfound) { echo 'Youre nasty!';}
else echo 'GoodGuy!';
0
Graben

Существует очень короткий php-скрипт, который вы можете использовать для определения плохих слов в строке, который использует str_ireplace следующим образом:

$string = "This dude is a mean mothertrucker";
$badwords = array('truck', 'shot', 'ass');
$banstring = ($string != str_ireplace($badwords,"XX",$string))? true: false;
if ($banstring) {
   echo 'Bad words found';
} else {
    echo 'No bad words in the string';
}

Единственная строка:

$banstring = ($string != str_ireplace($badwords,"XX",$string))? true: false;

делает всю работу.

0
Clinton
 $string = "This dude is a good man";   
 $bad = array('truck','shot','etc'); 
 $flag='0';         
 foreach($bad as $Word){        
    if(in_array($Word,$string))        
    {       
        $flag=1;       
    }       
}       
if($flag==1)
  echo "Exist";
else
  echo "Not Exist";
0
Jumper Pot

Если вы хотите сделать с array_intersect (), используйте следующий код:

function checkString(array $arr, $str) {

  $str = preg_replace( array('/[^ \w]+/', '/\s+/'), ' ', strtolower($str) ); // Remove Special Characters and extra spaces -or- convert to LowerCase

  $matchedString = array_intersect( explode(' ', $str), $arr);

  if ( count($matchedString) > 0 ) {
    return true;
  }
  return false;
}
0
Irshad Khan