JeuWeb - Crée ton jeu par navigateur

Version complète : [PHP] Commandes du type "/mp pseudo message"
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
Pages : 1 2 3
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
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 ! ^^
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 ?
Oooooooh, merci !!!
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 / ) ?
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.
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

Tu dois bien interpréter ce qui suit la commande à un moment.
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.
Pages : 1 2 3