[SPIP] +2.1.12
[velocampus/web/www.git] / www / plugins / auto / couteau_suisse / couteau_suisse / outils / spam.php
1 <?php
2
3 // anti-spam un peu brutal :
4 // 1. une liste de mots interdits est consultee
5 // 2. si le mot existe dans un des textes d'un formulaire, on avertit !
6
7 // cette fonction appelee automatiquement a chaque affichage de la page privee du Couteau Suisse renvoie un tableau
8 function spam_installe_dist() {
9 // tableau des mots interdits
10 $t = array(
11 // des liens en dur ou simili...
12 array('<a href=', '</a>', '[url=', '[/url]', '[link=', '[/link]',),
13 // des regexpr ou ips (sans delimiteurs)
14 array(), array(), array()
15 );
16 // repere les mots entiers entre parentheses, les regexpr entre slashes et les caracteres unicodes
17 $spam_mots = defined('_spam_MOTS')?spam_liste_mots(_spam_MOTS):array();
18 foreach($spam_mots as $v) {
19 if(preg_match(',^\((.+)\)$,', $v, $reg))
20 $t[1][] = '\b'.preg_quote($reg[1], '/').'\b';
21 elseif(preg_match(',^\/(&#)?(.*?)(;?)\/$,', $v, $reg))
22 $t[($reg[2] && $reg[3])?2:1][]=$reg[2];
23 else $t[0][] = $v;
24 }
25 $t[1] = count($t[1])?'/'.join('|',$t[1]).'/i':'';
26 $t[2] = count($t[2])?'/&#(?:'.join('|',$t[2]).');/i':'';
27 $spam_mots = defined('_spam_IPS')?spam_liste_mots(_spam_IPS):array();
28 array_walk($spam_mots, 'spam_walk');
29 $t[3] = count($spam_mots)?'/^(?:' . join('|', $spam_mots) . ')$/':'';
30 return array($t);
31 }
32
33 function spam_walk(&$item) {
34 $item = preg_replace(',[^\d\.\*\?\[\]\-],', '', $item);
35 if(preg_match(',^\/(.+)\/$,', $item, $reg))
36 $item = '('.$reg[1].')';
37 else $item = str_replace(array('\*','\?','\[','\]','\-'), array('\d+','\d','[',']','-'), preg_quote($item, '/'));
38 }
39
40 // retourne un tableau de mots ou d'expressions a partir d'un texte
41 function spam_liste_mots($texte) {
42 include_spip('inc/filtres');
43 $texte = filtrer_entites(trim($texte));
44 $split = explode('"', $texte);
45 $c = count($split);
46 $split2 = array();
47 for($i=0; $i<$c; $i++) if (($s = trim($split[$i])) != ""){
48 if (($i & 1) && ($i != $c-1)) {
49 // on touche pas au texte entre deux ""
50 $split2[] = $s;
51 } else {
52 // on rassemble tous les separateurs : \s\t\n
53 $temp = preg_replace("/[\s\t\n\r]+/", "\t", $s);
54 $temp = str_replace("+"," ", $temp);
55 $split2 = array_merge($split2, explode("\t", $temp));
56 }
57 }
58 return array_unique($split2);
59 }
60
61 ?>