Système de mention ?
- Accueil
- Forum
- Programmation
- PHP
- Système de mention ?
Balatharas Le 8 octobre 2016 à 19:19 (Édité le 25 janvier 2019 à 17:52)
@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 Le 8 octobre 2016 à 22:52 (Édité le 1 janvier 1970 à 01:00)
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 Le 9 octobre 2016 à 10:50 (Édité le 1 janvier 1970 à 01:00)
Balatharas Le 15 octobre 2016 à 21:28 (Édité le 1 janvier 1970 à 01:00)
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 Le 16 octobre 2016 à 03:02 (Édité le 16 octobre 2016 à 03:04)
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.
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 Le 23 octobre 2016 à 14:49 (Édité le 23 octobre 2016 à 16:33)
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 Le 3 décembre 2016 à 22:07 (Édité le 1 janvier 1970 à 01:00)
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 Le 4 décembre 2016 à 03:41 (Édité le 1 janvier 1970 à 01:00)
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 Le 4 décembre 2016 à 14:22 (Édité le 1 janvier 1970 à 01:00)
Balatharas Le 5 décembre 2016 à 19:08 (Édité le 5 décembre 2016 à 19:10)
Je sais pas pourquoi mais la condition retire un espace devant le arobase si elle détecte une mention exemple:
Message: Tu est gentil @bidulemachinAlors ça donnera:
Message: Tu es gentil@bidulemachin">@bidulemachinDe plus je voudrais enlever le arobase juste dans le lien de manière a avoir ça (survole le lien)
Message: Tu es gentil@bidulemachinJ'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 @bidulemachinJ'espère avoir été assez explicite ( @TheFlameFlo )
Balatharas Le 5 décembre 2016 à 19:22 (Édité le 5 décembre 2016 à 20:24)
<?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 Le 5 décembre 2016 à 22:03 (Édité le 1 janvier 1970 à 01:00)
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 Le 6 décembre 2016 à 18:15 (Édité le 1 janvier 1970 à 01:00)