2010-12-13 3 views
1

Exemple d'entrée utilisateur qui doit être refusée:Comment puis-je renie certains mots-clés sur l'entrée d'utilisateur

  • Maison pour sale
  • voiture pour rent
  • WTB iphone avec le prix pas cher

Comment faire pour que mon code refuse les entrées comme celles ci-dessus?

$title = array('rent','buy','sale','sell','wanted','wtb','wts'); 
$user_title = stripslashes($_POST['title']); 
if (in_array($user_title, $title)) { 
    $error = '<p class="error">Do not include ' . $user_title . ' on your title</p>'; 
} 
+0

J'espère que cela ne sert que d'exercice, car la prévention du spam est certainement plus complexe que la recherche de sous-chaînes. Vous pouvez utiliser un plug-in tel que Akismet. –

Répondre

4

Si vous voulez que vos mots niés soient des mots complets et pas seulement une partie d'un autre mot pour qu'elle soit considérée comme refusée, vous pouvez utiliser une solution à base de regex avec des limites de mots:

// array of denied words. 
$deniedWords = array('rent','buy','sale','sell','wanted','wtb','wts'); 

// run preg_quote on each array element..as it may have a regex meta-char in it. 
$deniedWords = array_map('preg_quote',$deniedWords); 

// construct the pattern as /(\bbuy\b|\bsell\b...)/i 
$pat = '/(\b'.implode('\b|\b',$deniedWords).'\b)/i'; 

// use preg-match_all to find all matches 
if(preg_match_all($pat,$user_title,$matches)) { 

    // $matches[1] has all the found word(s), join them with comma and print. 
    $error = 'Do not include ' . implode(',',$matches[1]);  
} 

Ideone Link

+1

+1 pour les mots complets. Merci :) – Blur

+1

+1, c'est la solution que je voulais faire mais je n'ai pas eu le temps. Très élégant et bien échelles. –

1

Vous pouvez utiliser stripos():

$title = array('rent','buy','sale','sell','wanted','wtb','wts'); 
$user_title = stripslashes($_POST['title']); 

foreach($title as $word) 
{ 
    if (stripos($user_title, $word) !== false) 
    { 
     $error = '<p class="error">Do not include ' . $word . ' on your title</p>'; 
     break; 
    } 
} 
+2

Mieux vaut 'stripos()' cependant, sinon il manquera 'RENT' –

+0

+1 pour ne pas utiliser regex, pas que ce soit une mauvaise chose, c'est juste un peu lent :-) – Bojangles

+0

@Pekka Merci, corrigé. –

0

Vous pouvez également utiliser regex:

if (preg_match("/(rent|buy|sale|sell|wanted|wtb|wts)/is", $user_title)) { 
    $error = '<p class="error">Do not include ' . $user_title . ' on your title</p>'; 
} 
0

Vous pouvez utiliser explode() afin de séparer les mots user_title de $ et vérifier chaque un pour s'assurer qu'il n'existe pas dans $ title.

$invalidWords = ''; 

$words = explode(' ', stripslashes($_POST['title'])); 
foreach($words as $word) { 
    if (in_array($word, $title)) { 
     $invalidWords .= ' ' . $word; 
    } 
} 

if (!empty($invalidWords)) { 
    echo '<p class="error">Do not include the following words in your title: ' . $invalidWords . '</p>'; 
} 

RegEx est probablement le meilleur, mais la figure de la main je ne peux pas facilement l'expression nécessaire pour que vous puissiez sortie tous les mots non valides dans une liste à l'utilisateur.

Questions connexes