Système de mention ?

Balatharas

Balatharas Le 8 octobre 2016 à 19:19 (Édité le 25 janvier 2019 à 17:52)

Hello, je voudrais faire un système de mention comme (exemple):
@PrimFX
Le but est d'attribuer un <a href="profil/mentionné"> à @mentionné. J'ai réussi à le faire grâce à ceci:
function mention($name) {
   $mention = array("@");
   $namecut = substr($name,0,1);
   $name2 = $name;
   if(in_array($namecut, $mention)) {
      $name2 = str_replace('@', '', $name2);      
      echo "<a href='../profil/".$name2."'>".$name."</a>";
   } else {
      echo $name;
   }
}
J'ai aussi réussi a enlever l'arobase pour le lien. Mais pour que le lien soit attribué, il faut que le @ soit en premier.. Et il faut aussi pouvoir différencier les pseudos mentionnés des adresse email.
Je voudrais aussi envoyer un mail quand la personne est mentionnée.

Merci :/
PrimFX

PrimFX Le 8 octobre 2016 à 22:52

Salut !

Pour faire un système de mentions du genre, je pense que le mieux serait de se tourner vers les expressions régulières histoire de remplacer automatiquement chaque occurrence de @[pseudo] par <a href="path/to/pseudo">@[pseudo]</a> (dans l'idée). Je n'ai pas le code sous la main, mais ça te fait déjà une bonne piste 😉

Concernant l'envoie de mail pour notifier une personne mentionnée, il suffit d'ajouter un mail() à ta fonction après avoir récupérer le mail correspondant au pseudo mentionné dans ta bdd :)

En espérant avoir pu t'aider,

Boris ('PrimFX')
Balatharas

Balatharas Le 9 octobre 2016 à 10:50

Salut @PrimFX merci je vais orienter mes recherches par la ^^
Balatharas

Balatharas Le 15 octobre 2016 à 21:28

Bon 😰
Si tu veux bien @PrimFX j'aimerais bien que tu fasses un tutoriel là-dessus, étant donné que tu fais des épisodes sur les REGEX en ce moment. Merci 😤
TheFlameflo

TheFlameflo Le 16 octobre 2016 à 03:02 (Édité le 16 octobre 2016 à 03:04)

Salut !

Comme PrimFX l'a dit, il faut se tourner vers les expressions régulières.
Donc, tu devras utiliser la fonction preg_replace, qui prend 3 paramètres : le pattern (la REGEX), comment il sera remplacé (j'en parlerai plus tard) et la chaîne.

Pour le pattern, je te conseille suivre les règles suivantes pour que ça marche :
  • NE commence PAS par une lettre ou un chiffre (utiliser '^'), ça permettra à ta regex de ne pas prendre en compte les mails.
  • Matcher un arobas
  • Par la suite, la règle pour les pseudos. Pour ce point, qui changera beaucoup de choses tu dois savoir si ton systèmes accepte les pseudos avec des espaces. Si c'est le cas, le système ne fonctionnera pas, tu devras alors rajouter une règle qui demande que la mention soit entourée de guillemets.
De plus, entoure les parties que tu veux utiliser plus tard, comme le pseudo, avec des parenthèses.

Pour le remplacement, tu fais une chaîne normale. Pour les informations, ils auront selon les parenthèses des numéros différents.
Donc, la variable $1 sera la première paire de parenthèses et ainsi de suite.
Il est important de ne pas concaténer les variables, voici à quoi ça devrait ressembler :
'<a href="tonsite.com/profil/$1">$1</a>'
Cependant, je dois t'avertir : j'ai fait le système de mon côté et je n'ai pas réussi à mettre "rien" au début et que ça capture quand même.
Aussi, si on matche tous les caractères sauf "un groupe" et qu'il y a un espace, il sera supprimé.

Si tu as des questions, n'hésite pas ! 😀
Bonne chance !

EDIT : Sinon, il y a ça que j'ai trouvé sur StackOverflow http://stackoverflow.com/questions/12015249/php-regex-for-mention. Ça peut peut-être aider ! 😀
Balatharas

Balatharas Le 23 octobre 2016 à 14:49 (Édité le 23 octobre 2016 à 16:33)

Saluut  @ TheFlameFlo
Bon, alors je bloque rien que sur la vérification du pseudo qui ne doit pas contenir d'espaces.. 😰
Voici mon preg_match:
$space = " ";
if(preg_match("#".$space."#", $_POST['pseudo']))
Cependant, cette condition ne sert absolument a rien 😠 l'utilisateur peut tout de même rentrer un espace dans son pseudo
Ah et merci pour le lien, mais déjà que j'ai du mal avec les regex quand ya pleins de conditions différentes, alors si c'est en Anglais, je capte rien 😕

EDIT: J'ai avancé côté affichage pour la mention, voici ce que j'ai mis:
if(preg_match("#@#", $bbparser2)) {
   $bbparser2 = preg_replace("^$1^", "<a href='../profil/$1'>$1</a>", $bbparser2);
}   
$bbparser2 c'est ma variable affichant le commentaire.
Mais ca ne fait rien quand j'ai un truc du genre "@Pseudo" peu importe où celui ci se trouve.
Par contre, si je remplace l'intérieur de la condition par echo "Oui !"; alors tant qu'il y a un @ ca me dira oui..
Balatharas

Balatharas Le 3 décembre 2016 à 22:07

Heyyy !
Alors voilà j'ai un peu progressé au niveau de regex, notamment pour la fonction preg_match.
Du coup je suis arrivé à ceci, pour détecter les mentions:
<?php
if(preg_match('#\s(@[a-zA-Z0-9]*)#', $contenu)) {
   echo "ya une mention !";
} else {
   echo "pas de mention..";
} 
?>
Donc cette regex me dis ya une mention ! si le mot commence par "@" (ex: @PrimFX)
Comme ça les adresse emails ne sont pas prises en comptes !
Mais maintenant, je sais pas comment ajouter un lien autour de @pseudo. En gros il me faut récupérer la valeur et éventuellement la stocker dans une variable pour par la suite récupérer le mail du pseudo (du compte) et lui envoyer le mail comme quoi il a été mentionné.

Voilà 😰
Merci d'avance pour votre aide !

PS: @TheOldNoob je t'identifie vu que tu es actif sur ce forum 😋 
TheFlameflo

TheFlameflo Le 4 décembre 2016 à 03:41

Salut !

J'avais oublié le sujet, désolé ! :P

La regex est super, maintenant, si je comprends bien, tu veux mettre la mention en tant que lien ?
Il te faut donc utiliser preg_replace de cette façon (dans ta condition) :
$str = preg_replace('#\s(@[a-zA-Z0-9]*)#', '<a href="tonlien">$1</a>', $contenu); 
Par la suite, tu affiches $str où toutes les mentions auront été remplacées.
J'imagine que ça devrait marcher ! 😀

Pour ce qui est de récupérer les mentions pour ensuite trouver le mail ou autre chose, preg_match te sera utile pour récupérer les matches.
En regardant la doc PHP, on voit qu'il y a des paramètres optionnels dans preg_match où tu peux mentionner un tableau où tout ce qui correspond est stocké et que tu peux réutiliser plus tard.

Bonne chance ! 😀
Balatharas

Balatharas Le 4 décembre 2016 à 14:22

D'acc merci beaucoup je vais voir ça quand je pourrais 😉 !
Balatharas

Balatharas Le 5 décembre 2016 à 19:08 (Édité le 5 décembre 2016 à 19:10)

Bon, alors j'ai testé et le lien se met bien autour de la mention MAIS
Je sais pas pourquoi mais la condition retire un espace devant le arobase si elle détecte une mention exemple:
Message: Tu est gentil @bidulemachin
Alors ça donnera:
Message: Tu es gentil@bidulemachin">@bidulemachin
De plus je voudrais enlever le arobase juste dans le lien de manière a avoir ça (survole le lien)
Message: Tu es gentil@bidulemachin
J'ai essayer ça:
<?php
$request = "Héhé ! @machintruc !";
if(preg_match('#\s(@[a-zA-Z0-9]*)#', $request, $match)) {   
   $contenu = preg_replace('#\s(@[a-zA-Z0-9]*)#', str_replace('@', '', '<a href="profil/$1">$1</a>'), $request);
}
echo $contenu;
?>
Et apparemment il s'en bat les steaks de mon str_replace..

Donc en gros voilà ce que je voudrais au final:
Message: Tu es gentil @bidulemachin
J'espère avoir été assez explicite ( @TheFlameFlo
Balatharas

Balatharas Le 5 décembre 2016 à 19:22 (Édité le 5 décembre 2016 à 20:24)

Ah ! Bah j'ai réussi !
<?php
$request = "Héhé ! @machintruc !";
if(preg_match('#\s(@[a-zA-Z0-9]*)#', $request, $match)) {
   $match['1'] = str_replace('@', '', $match['1']);
   $contenu = preg_replace('#\s(@[a-zA-Z0-9]*)#', '<a href="profil/'.$match['1'].'">'.$match['0'].'</a>', $request);
}
echo $contenu;
?>
Je m'explique, on sait jamais pour ceux qui ont un problème de ce genre:
Alors en gros la variable $match contient un tableau:

array (size=2)
0 => string ' @machintruc' (length=12)
1 => string '@machintruc' (length=10)

Donc en gros il suffit de faire un str_replace sur $match['1'] pour enlever le arobase, et ensuite mettre la var $match['0'] (qui contient l'espace au début) entre les balises liens !
Voilà 😋

EDIT: Bon, au final yavait un bug, donc j'ai changé ma regex pour mettre ceci à la place:
#\s@([a-zA-Z0-9]*)#
donc ceci donne exactement ce que je veux:
<?php
if(preg_match('#\s@([a-zA-Z0-9]*)#', $i['contenu'], $match)) {
   $i['contenu'] = preg_replace('#\s@([a-zA-Z0-9]*)#', '<a href="profil/$1">$0</a>', $i['contenu']);
}
?>
mais le dernier petit truc, c'est l'espace qui se trouve au tout début de $0 et au niveau CSS quand on survole le lien, ca donne ça:   @mentionné
Une solution ?
TheFlameflo

TheFlameflo Le 5 décembre 2016 à 22:03

Ce qu'il faudrait faire, c'est enlever l'espace avant le $0 et le rajouter avant le lien.
Si tu veux pas tout modifier, tu mets $1 entre les deux balises de lien mais tu rajoutes un @ avant $1 et un espace avant le lien, donc quelque chose comme ça :
if(preg_match('#\s@([a-zA-Z0-9]*)#', $i['contenu'], $match)) {
   $i['contenu'] = preg_replace('#\s@([a-zA-Z0-9]*)#', ' <a href="profil/$1">@$1</a>', $i['contenu']);
}
Balatharas

Balatharas Le 6 décembre 2016 à 18:15

Ok merci beaucoup, je met pas le sujet en résolu, je le ferais quand je serai sûr 😋 :p
Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte