Pb d'expression régulière

Résolu
ludovicanceaux Messages postés 440 Date d'inscription mardi 21 octobre 2003 Statut Membre Dernière intervention 6 mai 2010 - 18 mars 2008 à 16:31
ludovicanceaux Messages postés 440 Date d'inscription mardi 21 octobre 2003 Statut Membre Dernière intervention 6 mai 2010 - 21 mars 2008 à 17:35
Salut à tous,

j'ai créé une boite mail sur mon serveur pour que les membres puissent dialoguer entre eux, poser des questions etc...., (tout ca, mais ss s'échanger ni leur numéro de téléphone, ni leur adresse mail, ni des insultes etc...) il faut que ca reste ds la charte du site, seulement j'ai un problème je comprend que dalle aux expressions régulières (j'ai regardé des tuto, mais c'est compliqué, les "&" et aussi "$" etc..., j'ai déjà fait ca:

$message='<html><head></head>';
$message.='Un membre a posté un message à votre attention sur http://www.galarea.com, vous pouvez aller le voir dès maintenant</html>';

if(ereg("([0-9])",$message)){
    echo 'true';
}else{
    echo 'false';
}

donc là ca marche pour les chiffres, mais sitot que je passe à des mots ou des lettre style "@", je n'y arrive plus!!!!

Merci d'avance

16 réponses

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
21 mars 2008 à 17:18
A peu près...

Principale différence au niveau du masque de recherche : il doit être entouré de délimiteurs.
Le premier caractère rencontré dans la chaine est le délimiteur : il doit aussi terminer le masque.
Par exemple : preg_match('`(trucatrouver)`Ui', $expression);
U et i sont des options : après le délimiteur de fin, mais dans la chaine 'pattern'...
Plus d'infos sur lumadis.be/regex

preg_match retourne : 0 ou 1 en cas de succès (0 ou 1 fois le motif trouvé), et false en cas d'échec : attention donc lors du test...
if (pre_match(....))
ne fonctionnera que si le motif est trouvé. Et
if (!preg_match(....))
fonctionnera si le motif n'est pas trouvé OU s'il y a une erreur (regex non valide)
Le mieux est de tester avec :
if (preg_match(.....) !== FALSE)
!== et pas != hein, c'est pas pareil...

Et puis la doc de PHP est pas mal aussi ;)

preg_match_all() fonctionne pareil que preg_match() à la différence que si un motif est trouvé, elle continue. preg_match() s'arrête dès que le motif est trouvé, tant pis s'il est présent 3 fois dans la chaine...

Voilà.

<hr size="2" width="100%" />Neige
3
ludovicanceaux Messages postés 440 Date d'inscription mardi 21 octobre 2003 Statut Membre Dernière intervention 6 mai 2010
18 mars 2008 à 16:41
je viens de trouver un truc.

if(eregi("([0-9]|@|www|message)",$message)){
    echo 'true';
}else{
    echo 'false';
}

est ce que ce système là est assez fiable???
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
18 mars 2008 à 18:04
Salut,

Qu'est-ce que tu souhaites faire exactement ?
Parce qu'avec les PCRE (à utiliser plutôt que les regex posix ereg, eregi, etc) tu peux faire à peu près n'importe quoi...

Les Expressions Régulières, au début, j'avais aussi beaucoup de mal... Mais à force de persévérance, j'ai commencé à faire des trucs... Pis maintenant j'adore ça (j'en mettrais pas partout pour autant quand même).
Donc essaie de mieux expliquer ton problème, ce que tu veux faire précisément, et on verra la solution à mettre en oeuvre...

<hr size="2" width="100%" />Neige
0
ludovicanceaux Messages postés 440 Date d'inscription mardi 21 octobre 2003 Statut Membre Dernière intervention 6 mai 2010
18 mars 2008 à 18:25
lol, bah en fait les membres peuvent dialoguer entre eux sur le site, via une boite mail stocké en sql que j'ai faite (un peu comme ebay), mais ce que je voudrais c'est garder le control des messages et quand il detecte des mots clefs (ex: @, un numéro de téléphone, message, adresse, etc...)  il m'enregistre dans ma bdd à la colonne activate : false au lieu de true, ca veux
dire qu'il désactive le message, tant que je l'ai pas lu et réactivé moi
même...
En fait c'est un site de vente d'objet d'art, et il ne faudrait pas que les membres finalisent leur transactions en dehors du site.

merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ludovicanceaux Messages postés 440 Date d'inscription mardi 21 octobre 2003 Statut Membre Dernière intervention 6 mai 2010
18 mars 2008 à 18:25
c'est vrai que c'est un peu compliqué
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
18 mars 2008 à 18:41
C'est vrai que c'est pas le plus simple... Pour m'être penché à une époque sur cette question (exactement la même) j'en étais personnellement arrivé à la conclusion que le système ebay est le plus facile à mettre en place : les membres paient dès la mise en vente d'un objet, quel que soit le résultat de la vente (c'est entre autres ce qui a lancé la mode des enchères à 1?).
Le fait aussi que les messages soient publics incite les gens à ne pas y laisser trainer leurs coordonnées personnelles.

Bref. Pour revenir à ton problème...

ereg est moins performant que preg_match. C'est un fait testé, avéré et éprouvé, et même énoncé dans la doc de php.

Concernant le motif à utiliser... Celui que tu as n'est pas mauvais. Simplement, trop de tests OU (motif1|motif2|motif3) va tuer les performances. Donc en mettre un peu oui, mais pas uniquement de ça (genre pas pour 15 ou 20 motifs à trouver).

Avec preg_match, ton motif donnerait ça :

if (preg_match('`([0-9]|@|www|message)`i', $message)) {
    echo 'true';
}
else {
    echo 'false';
}

J'y pense : ton système ne sera pas infaillible... Il suffit d'écrire une adresse email comme ça : nom point prenom at domaine point tld pour que tu ne puisse pas la détecter... Et si tu commences à t'amuser à chercher les noms de domaines dans le texte (gmail.com, hotmail.fr, neuf.fr, free.fr, etc) tu vas anéantir ton serveur.
Si tu cherches les chiffres, tu vas te taper tous les messages où transitent des cotes, des dimensions, des départements, ...

Quitte à filtrer les messages, tu ferais mieux de tous les valider à la main... Ouais, ça fait beaucoup... Ou alors, tu forces à ce qu'ils soient publics. Je sais, c'est pas la solution à ta question, mais j'essaie aussi de rationnaliser ton affaire ;)

<hr size="2" width="100%" />Neige
0
ludovicanceaux Messages postés 440 Date d'inscription mardi 21 octobre 2003 Statut Membre Dernière intervention 6 mai 2010
18 mars 2008 à 21:38
mais je pense que tu as raison, ca va tuer les performances si je vérifie 20 messages par 20 messages, mais si je vérifie 1 message par 1 message, au moment de l'envoie par exemple, ca ne doit pas utiliser trop de ressources??? en fait je créer une bdd avec 5 colonnes "id / from / to/ lu / activation" et en fait je fais la vérification au moment ou le membre envoie le message, et dc ca enregistre false ou true ds la colonne activation, en fait je sais que ce n'est pas infailllible, mais ca me permet de faire une préselection, après rien ne m'empèche par la suite de regarder d'autre message comme code source doit dailleurs le faire, au moment ou il désactive des sources, ou des questions dans le forum, enfin j'ai besoin de ton avis!!!!
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
18 mars 2008 à 23:49
Je parlais pas de 20 messages par 20 messages, mais de 20 tests de type OU exclusif dans ton expression régulière, qui correspondent au masque (mot1|mot2) ou le pipe | sert de sélecteur.

Si tu fais ça pour quelques mots, comme ceux que tu as énoncés, a priori, ça me choque pas : la vérif se fera uniquement quand un membre enverra un message à un autre, pas à chaque chargement de page. Donc de ce côté là, c'est pas la mort. Mais si tu rajoutes des mots à filtrer, que t'en as 20, parce qu'avec le temps tu te rends compte qu'il y a plus d'expressions auxquelles faire attention (mail, tél, téléphone, appelle-moi, numero, adresse, ecris-moi, call, at, point com, point fr, etc) là, ça va commencer à être méchant.

Ma conclusion, c'est que soit t'as un système de filtre imparfait que tu ne pourras améliorer que dans une certaine limite et au détriment des performances, soit tu modères a priori (tous les messages doivent être validés), soit tu changes de système...
Le filtre, c'est super tentant, je le reconnais... Seulement, si tu veux avoir un truc super mortel dugne d'un moteur de recherche comme google, il te faudra investir dans plusieurs centaines de machines 10 fois plus performantes que ton super pc tuning overclocké pour les jeux, et il te faudra utiliser non pas un langage comme PHP, mais plutôt du C, plus proche de la machine.
Sincèrement, à ta place, j'oublierais le système de filtre... Sauf si tu te fais une raison et que tu sais que tous les messages ne peuvent être filtrés. Donc comme préselection, moui... Mais je ne doute pas une seconde du niveau de vice des internautes qui cherchent à grapiller 20 centimes d'euros par ci, 10 centimes par là... Autant tout modérer a priori.

Après, tu peux te baser sur cette contrainte pour rajouter des services payants : un membre fidèle, bien noté, qui a plusieurs transactions derrière lui, pourrait souscrire un abonnement lui permettant d'échapper à la modération à priori ; ses messages ne seraient pas filtrés (mais pourraient encore être contrôlés).

Tout ça, c'est que mon avis à moi... Je le trouve pertinent, forcément... C'est subjctif. D'autres pourraient certainement y trouver à redire, y'a peut-être même des trucs dont j'ai pas conscience qui peuvent faire exactement ce que tu veux 50000 fois en 0,1 ms.

Peux pas te dire mieux.

<hr size="2" width="100%" />Neige
0
ludovicanceaux Messages postés 440 Date d'inscription mardi 21 octobre 2003 Statut Membre Dernière intervention 6 mai 2010
19 mars 2008 à 10:51
ok, je te remercie de tes explications, je vais peut etre faire comme tu m'as dis, de placer des notes pour les transaction, et je vis filtrer que ceux qui ont une petite note, enfin je vais en parler à mon boss ;-), sinon à part ca j'aimerais bien apprendre tous sur les expressiions régulières, ca me parait interressant, mais un peu compliqué, alors connais tu des bon tuto, évite de me dire manuelphp ou les autres du même style, car je n'ai pas trouvé mon bonheur, même le site du zéro je l'ai lu mais il ne rentre pas ds les détails, merci
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
19 mars 2008 à 10:56
Héhé... Ouais, j'ai un chouette tuto dans mes favoris... Même qu'y a un testeur de Regex (PCRE ou Posix) :

Regex - Expressions régulières PCRE

<hr size="2" width="100%" />Neige
0
ludovicanceaux Messages postés 440 Date d'inscription mardi 21 octobre 2003 Statut Membre Dernière intervention 6 mai 2010
19 mars 2008 à 10:56
et pour faire au moins une préselection des mails, quel fonction me conseille tu d'utiliser, je pense utiliser une petite dizaine de mot
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
19 mars 2008 à 11:32
Re,

Euh ben j'en sais rien... lol
Essaie d'imaginer ce qu'on peut se dire dans un message privé pour se contacter par mail ou téléphone...
genre : mail, adresse, ... je sais pas trop à vrai dire...
Mais si tu te limites à une dizaine de mots, tu peux utiliser un masque dans ce genre :
([0-9]|@|mail|adresse|etc)
Là comme ça, il me vient rien de plus...

<hr size="2" width="100%" />Neige
0
ludovicanceaux Messages postés 440 Date d'inscription mardi 21 octobre 2003 Statut Membre Dernière intervention 6 mai 2010
21 mars 2008 à 14:50
En fait je parlais surtout du type de fonction que j'utilise, est ce que tu me conseille d'utiliser une autre fonction que ereg???
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
21 mars 2008 à 15:47
Au temps pour moi...

preg_match évidemment

<hr size="2" width="100%" />Neige
0
ludovicanceaux Messages postés 440 Date d'inscription mardi 21 octobre 2003 Statut Membre Dernière intervention 6 mai 2010
21 mars 2008 à 15:53
ok, merci, je suppose que la syntaxe reste la même:

if(preg_match("([0-9]|@|www|message)",$message)){
      blablablabla
}else{
      blablablabla
}
0
ludovicanceaux Messages postés 440 Date d'inscription mardi 21 octobre 2003 Statut Membre Dernière intervention 6 mai 2010
21 mars 2008 à 17:35
oki, je te remercie pour tes conseils, je pense que je vais réussir à me débrouiller, merci encore
0
Rejoignez-nous