JeuWeb - Crée ton jeu par navigateur
[PHP] Commandes du type "/mp pseudo message" - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [PHP] Commandes du type "/mp pseudo message" (/showthread.php?tid=5475)

Pages : 1 2 3


[PHP] Commandes du type "/mp pseudo message" - Cawrotte - 05-06-2011

Bonjour à tous et à toutes,

Je souhaite intégrer un t'chat à mon jeu.
Un t'chat, c'est bien, mais un t'chat sans messages privés n'en est pas vraiment un...

Je cherche donc à faire reconnaître à mon script PHP un message sous la forme :
/mp pseudo message

ou plus simples :
/dormir temps

Je pense qu'il faut utiliser les expressions régulières, mais je ne vois pas du tout la forme qu'elle pourrait prendre ni comment l'intégrer dans mon script.

Je vous remercie par avance de votre aide Smile


RE: [PHP] Commandes du type "/mp pseudo message" - Sephi-Chan - 05-06-2011

Je n'ai pas la version PHP de ce que tu demandes, mais voici la version Ruby qui te permettra peut-être de comprendre comment utiliser une regexp relativement simple.

La plupart des instructions peuvent être portée ligne par ligne en PHP, la seule inconnue pour moi, c'est l'écriture de la regexp et la capture des éléments inscrits dans les parenthèses parenthèses capturantes.


message = "/whisper pseudo Mon message qui tue."
message = "/y Endive !!!"
message = "/sell pseudo épée 30 Tu la veux ma grosse épée ?"

matches = /\/([a-z]+) (.+)/.match(message)

if matches
command = matches[1] # "mp"
arguments = matches[2] # "pseudo Mon message qui tue."

case command
when 'w', 'whisper'
# Commande pour chuchoter.
# Arguments : destinataire, message.
# Je sépare mes arguments selon les espaces en spécifiant que je ne veux
# que 2 groupes. Du coup, le message ne sera pas séparé mot par mot.
split_arguments = arguments.split(' ', 2)
target = split_arguments[0]
message = split_arguments[1]

# ...
when 'y', 'yell'
# Commande pour crier.
# Arguments : message.
message = arguments

# ...
when 'sell'
# Commande pour vendre un objet.
# Arguments : destinataire, objet, prix, [message].
split_arguments = arguments.split(' ', 4)
target = split_arguments[0]
item = split_arguments[1]
price = split_arguments[2]
message = split_arguments[3] || ""

# ...
else
# Commande non reconnue.
end
end

Voilà, si ça peut t'aider ! ^^


RE: [PHP] Commandes du type "/mp pseudo message" - Cawrotte - 05-06-2011

C'est génial ! Je vais essayer de le faire en PHP.

mais pour le switch en php c'est case en ruby,
et pour case en php c'es when en ruby si je comprends bien ?


RE: [PHP] Commandes du type "/mp pseudo message" - Sephi-Chan - 05-06-2011




RE: [PHP] Commandes du type "/mp pseudo message" - Cawrotte - 05-06-2011

Oooooooh, merci !!!


RE: [PHP] Commandes du type "/mp pseudo message" - Ter Rowan - 05-06-2011

est ce pertinent d'utiliser une expression régulière pour un cas de ce type ?

pourquoi pas un split basé sur l'espace, avec après le switch (en pensant à mettre le / ) ?



RE: [PHP] Commandes du type "/mp pseudo message" - Sephi-Chan - 05-06-2011

En fait, ça implique de tester d'abord la présence du / en tant que premier caractère. Puis ensuite de faire le split. A tester.


RE: [PHP] Commandes du type "/mp pseudo message" - Ter Rowan - 05-06-2011

bah pourquoi tester ?

le switch case le fait très bien :

case '/sell' :
action_de_vente($param);
break;

default :
c_est_juste_du_tchat($texte);



où bien y a un truc que je vois pas (sécurité, ..) c'est tout à fait possible




RE: [PHP] Commandes du type "/mp pseudo message" - Sephi-Chan - 05-06-2011

Tu dois bien interpréter ce qui suit la commande à un moment.



RE: [PHP] Commandes du type "/mp pseudo message" - Jeckel - 06-06-2011

Les expressions régulières sont souvent longue et à utiliser en dernier recours en PHP.

Faire juste un split par contre suppose que tous les mots ou commandes sont bien séparé par un seul espace (un peu contraignant).

Du coup je serais plutôt pour une solution intermédiaire : (attention, code de tête)

$message = "/whisper pseudo Mon message qui tue.";
$message = "/y Endive !!!";
$message = "/sell pseudo épée 30 Tu la veux ma grosse épée ?";

// ne pas utiliser d'expression régulière tant que ce n'est pas nécessaire :
if ($message[0] == '/') // Ok, on a peut-être une commande
{
$cmd = strtolower(substr($message, 1, strpos($message, ' '))); // on récupère ce qui suis le / jusqu'au premier espace et en minuscule
$arguments = trim(substr($message, strpos($message, ' ')+1));
switch($cmd)
{
case 'w':
case 'whisper':
$split_arguments = preg_split('/[ \t]+/', $arguments, 2);
$target = $split_arguments[0];
$message = $split_arguments[1];
// ...
break;
case 'y':
case 'yell':
$message = $arguments;
// ...
break;
case 'sell':
$split_arguments = preg_split('/[ \t]+/', $arguments, 4);
$target = $split_arguments[0];
$item = $split_arguments[1];
$price = $split_arguments[2];
$message = $split_arguments[3] ? $split_arguments[3] : '';
// ...
break;
default:
// Commande non reconnue.
break;
}
}

Le preg_split permet ici de faire un split sur une expression régulière et donc fonctionne aussi si on a plusieurs espace, de plus elle n'est utilisé que lorsque l'on a pas vraiment le choix.