Besoin d'un tout petit coup de main PHP svp

WRInaute accro
Salut à tous.

Je cherche à vérifier si une série de caractères (appelons-la "foo") fait partie d'une variable appelée $bar, auquel cas j'effectue une action...

pour l'instant j'utilise le code suivant:
Code:
if(eregi("foo",$bar)) { action ;}

Je voudrais pouvoir définir une série de "foo" qui seraient tous déclencheurs de cette action; pour ce faire je pensais définir une array juste avant, contenant les "foo", mais le code suivant ne fonctionne pas...

Code:
$trigger = array("foo1","foo2");
if(eregi("$trigger",$bar)) { action ;}

L'un d'entre vous aurait-il une solution proche de ça ?

Merci !
 
WRInaute accro
il faut que tu mette également un tableau dans le deuxieme argument.

Code:
$trigger = array("foo1","foo2");
$trigger2 = array($bar, $bar);
if(eregi("$trigger", $trigger2)) { action ;}
oui, c'est crade, mais je vois pas d'autres solutions comme ca.
 
WRInaute occasionnel
La tentation était trop forte, le mot crade m'a interpellé :lol:

$Chaine='Salut truc bidule, blablabla';
$Mots=array('truc','bidule');
$Remplacement='machin');

foreach($Mots as $n=>$mot) {
str_replace($mot,$Remplacement,$Chaine);
}

Franchement, à coté de ça, le eregi(); passe tout seul non ? ;)
 
WRInaute accro
oui Vell, mais tu appelle autant de fois eregi qu'il y a d'entrées dans le tableau.

en conséquent, tu consomme des ressources pour rien.
la, ca va parce que tu n'a que peu d'entrées, mais mon fidele serviteur HawkEye_TpfH (j'ai changé mon avatar hein) n'a pas précisé le nombre d'entrées qu'il aura par la suite.
si il en a des centaines, voir des milliers, ca consomme du cpu pour rien (meme si il en a peu, mais ca se verra moins)
 
WRInaute accro
Bien vu, Ô Maître-que-je-reconnais-à-présent-qu'il-ne-masque-plus-son-visage-dans-la-brume...

Effectivement, la liste sera vite longue puisque l'objectif est de rendre l'annuaire présent dans mon [www] complètement "child proof" (virer toute possibilité de rechercher f*ck, p*rn, inc*st et autres termes du style,...)

Je vais déjà tenter ta solution, on va voir ce que ça donne... Le code crade, je connais de toutes façons (un site dirigé par une et une seule page, ça peut pas être propret hein... :mrgreen: mais bon, quand c'est ta propre crasse, t'es bien dedans :mrgreen:)

Si d'autres ont une idée...
 
WRInaute accro
pour le second tableau, tu fait un sizeof() du premier, et tu ajoute autant d'entrées que necessaire.

Code:
$i = 1;
while ($i <= sizeof($tab)) {
$tab2[] = $bar;
}
 
WRInaute accro
Bon ben je crois que c'est la solution KaZhaR #1 qui sera appliquée, même si elle est crade, parceque l'autre, mon serveur fait "SCKROÏNCH"...

(Et comme c'est gracieusement prêté par un ami, je vais éviter de lui flamber...)
 
WRInaute accro
oui nodom, il fonctionnera, je suis tout à fait daccord.
cependant, il consommera plus de cpu que le mien étant donné qu'il appelle autant de fois la fonction eregi qu'il y a de mots, soit des milliers de fois.

ce n'est donc pas le plus optimisé (ce que j'ai écrit plus haut est bien affiché, et lisible en français au moins ?)
 
WRInaute occasionnel
Et pourquoi pas un simple:

Code:
in_array($bar, $trigger)

sachant que $trigger peut être un tableau. Retourne un booléen si la valeur est contenue dans le tableau.

Ca c'est une fonction fournie avec une bouteille de Mr Propre, contre le code crade :)
 
WRInaute accro
Ahaaaaa...

attends j'essaye...

[edit]
euh... non en fait... car dans ce cas, une recherche sur le terme "f¨ck" serait bloquée, mais pas une recherche sur le terme "f¨uck cows"...

'tain c fumant ce truc...
 
WRInaute occasionnel
Sachant que eregi peut prendre des expressions régulières, tu peux tout simplement faire :

Code:
if(eregi("foo1|foo2", $bar)) { action; }
 
WRInaute accro
Bien vu jerome347, ça fonctionne, c'est propre et c'est facile.

Merci beaucoup !

(aux autres aussi!)

maintenant si tu cherches "f*uck" par exemple, c'est redirigé vers une page de blocage, c'est tout bon...
 
Nouveau WRInaute
Sinon si c'est une question de rapidité du cpu il y a les fonctions pcre (issus de perl), en principe c'est plus rapide,
celle qui pourrait te correspondre est preg_match, mais le motif de chaine est légèrement différent de celui de ereg fonction posix:
if(preg_match("`(foo1|foo2)`", $bar)) { action; }
 
WRInaute occasionnel
KaZhaR a dit:
oui nodom, il fonctionnera, je suis tout à fait daccord.
cependant, il consommera plus de cpu que le mien étant donné qu'il appelle autant de fois la fonction eregi qu'il y a de mots, soit des milliers de fois.

ce n'est donc pas le plus optimisé (ce que j'ai écrit plus haut est bien affiché, et lisible en français au moins ?)
d'accord mais le votre consomme aussi de la mémoire. en fin la solution dépend du volume. la construction d'une grande liste eregi ferait l'affaire mais toujours non optimisé, peut être une requête SQL à la base serait mieux (en mettant les mots interdits dans une tables). ça serait aussi facile à mantenir:
select count(*) from mots
where mot like serach
on peut remplacer lire par une fonction expression régulière.
 
Discussions similaires
Haut