web-dev-qa-db-fra.com

Vérifier si la chaîne contient Word dans le tableau

Ceci est pour une page de discussion. J'ai un $string = "This dude is a mothertrucker". J'ai un tableau de mots incorrects: $bads = array('truck', 'shot', etc). Comment vérifier si $string contient l'un des mots de $bad?
Jusqu'à présent, j'ai:

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

Sauf lorsque je le fais, lorsqu'un utilisateur tape un mot dans la liste $bads, la sortie est NON! suivi de OUI! donc, pour une raison quelconque, le code est exécuté deux fois.

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

1) Le moyen le plus simple:

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

2) Autre moyen (lors du contrôle des tableaux vers d'autres tableaux):

$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

pouvez-vous s'il vous plaît essayer cela au lieu de votre code

$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

Vous pouvez retourner votre mauvais tableau de mots et effectuer la même vérification beaucoup plus rapidement. Définissez chaque mauvais mot en tant que clé du tableau. Par exemple,

//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
}

Dans ce code, nous vérifions simplement si un index existe plutôt que de comparer le mauvais mot avec tous les mots de la liste des mauvais mots.
isset est beaucoup plus rapide que in_array et légèrement plus vite que array_key_exists .
Assurez-vous qu'aucune des valeurs du mauvais tableau Word n'est définie sur null .
isset retournera false si l'index du tableau est défini sur null.

3
Abhijit Amin

Mettez et quittez ou mourez une fois qu'il trouve des mots incorrects, comme celui-ci

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

Voulu cela?

$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

J'irais de cette façon si la chaîne de discussion n'est pas si longue.

$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

Il existe un script php très court que vous pouvez utiliser pour identifier les mots incorrects dans une chaîne qui utilise str_ireplace comme suit:

$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';
}

La seule ligne:

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

fait tout le travail.

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

Si vous voulez faire avec array_intersect (), utilisez le code ci-dessous:

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