2010-08-25 3 views
2

J'ai un formulaire de contact, j'ai besoin de filtrer quelques mots.PHP - Expressions régulières Besoin d'aide

que je fais comme suit:

$array = array('lorem', 'ipsum', 'ip.sum'); 
for($i = 0; $i < count($array); $i++) 
     { 
      if(preg_match("/".$array[$i]."/", (string) $field)) 
      { 
       return false; 
      } 
     } 

Je ne suis pas un maître regex, mais il faut travailler pour des mots comme: Lorem ipsum ou. Mais ce n'est pas.

BTW. Toutes les suggestions comment attraper des mots mal orthographiés, ex. i.psum, l.o.rem?

Mise à jour
Bien sûr, je n'ai pas de modèle vide, j'ai oublié de le coller.

Mise à jour 2
J'ai décidé de obtenu de la manière suggérée par Daniel Vandersluis. Abnyway, je ne suis pas capable de le faire fonctionner.

$field = "ipsum lorem"; // This value comes from textarea 
$array = array('ipsum', 'lorem', 'ip.sum'); 
foreach($array as $term): 
    if(preg_match('/'.preg_quote($term).'/', $field)) { 
     return false; 
    } 
endforeach; 

Des idées?

+3

'" // "' est un motif vide ... qu'est-ce que vous essayez de faire? –

+0

Où est la signature de la fonction? Quel est le contexte? –

+0

Lire http://www.codinghorror.com/blog/2008/10/obscenity-filters-bad-idea-or-incredibly-intercoursing-bad-idea.html – Gumbo

Répondre

3

Si je comprends bien, et que vous voulez voir si l'un des mots dans votre tableau sont dans votre domaine, vous pouvez faire quelque chose comme ceci:

function check_for_disallowed_words($text, $words) 
{ 
    // $text is the text being checked, $words is an array of disallowed words 
    foreach($words as $word) 
    { 
    if (preg_match('/' . preg_quote($word) . '/', $text)) 
    { 
     return false; 
    } 
    } 

    return true; 
} 

$array = array('lorem', 'ipsum', 'ip.sum'); 
$valid = check_for_disallowed_words($field, $array); 

Dans votre exemple, vous ne définissiez aucun modèle à utiliser. preg_quote prendra une chaîne et la rendra prête à l'emploi dans une expression régulière (parce que, par exemple, le point ip.sum a effectivement special meaning dans une expression régulière, il doit donc être échappé si vous voulez rechercher un point littéral). En outre, si vous souhaitez en savoir plus sur les expressions régulières, jetez un oeil à la tutorial sur regular-expressions.info, il est très en profondeur.

+0

Daniel, pourriez-vous être si gentil et jeter un coup d'œil à la question? Suis-je idiot ou je suis aveugle? :) –

+0

@Frank ce qui ne fonctionne pas? –

+0

@Frank serait ma supposition que vous n'avez pas mis le code dans une fonction soit correcte? Vous ne pouvez pas avoir une instruction 'return' en dehors d'une fonction. J'ai mis à jour mon code avec un exemple. –

0

changement

if(preg_match("//", (string) $field)) 

à

if(preg_match("/$array[$i]/", (string) $field)) 
+0

Merci de l'avoir signalé, c'était une faute de frappe seulement;) –

2

Vous n'avez pas besoin regexes pour le filtrage de texte simple.

function is_offensive($to_be_checked){ 
    $offensive = array('lorem', 'ipsum', 'ip.sum'); 
    foreach($offensive as $word){ 
     if(stristr($to_be_checked, $word) !== FALSE){ 
      return FALSE; 
     } 
    } 
} 

Utilisation:

$field = $_POST['field']; 
if(is_offensive($field)){ 
    echo 'Do not curse on me! I did not crash your computer!'; 
} 
else{ 
    //make the visitor happy 
} 
1

J'ai traduit votre question pour moi comme ceci: comment puis-je remplacer des mots d'une variable via un ensemble d'expressions régulières.

Vous pouvez essayer ceci:

$array = array('lorem', 'ipsum', 'ip.sum', ''); 

$field = preg_replace("/(" . implode(")|(", $array) . ")/i", "--FILTERED-OUT--", (string) $field)); 

Il construit la finale expression régulière à partir d'éléments de $array. Pour que vous puissiez spécifier un mot comme expression régulière (ip.sum ~ ip [quel que soit le caractère] sum). Le drapeau i est utilisé pour la recherche insensible à la casse.

+0

+1 pour l'efficacité, même si les champs de recherche n'étaient pas entre guillemets (donc il y a possibilité d'avoir une regex invalide) ... – ircmaxell

+0

Je suppose que dans $ array sont des regexes. Sinon 'preg_quote' peut être appliqué à tous les éléments du tableau via' array_map' (je suppose). –

0

Une autre variante, peut-être c'est d'une certaine utilité (vous ne spécifiez pas le problème très bien):

Edité selon le commentaire de l'utilisateur:

// comparison function 
function check_field_in($field, $phrases) 
{ 
foreach($phrases as $phrase) { 
    $match_text = quotemeta($phrase);   // if this works, 
    if(preg_match("/^$match_text$/", $field)) // this part can be optimized 
     return false;        
} 
return true; 
} 

// main program goes here 
$textarea = 'lorem ipsum i.psum l.o.rem'; 

foreach(preg_split('/\s+/', $textarea) as $field) { 
    if(check_field_in($field, array('lorem','ipsum')) == true) 
     echo "$field OK\n"; 
    else 
     echo "$field NOT OK\n"; 
} 

Ce imprimera:

lorem NOT OK 
ipsum NOT OK 
i.psum OK 
l.o.rem OK 

Cordialement

rbo

+0

@rbo - Nous sommes proches de ce que je veux mais j'ai besoin de retourner false est la chaîne textarea contient n'importe quelle clé de tableau. –

+0

@Frank: échange ** return true ** avec ** return false ** et vous avez terminé! –