Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Tipo, to pensando em montar um chat.
e tnho a seguinte duvida.
tenho o db
-> chat.
tebela
-> conversas
campos
->id
->de
->para
->data
->hora
->mensagem
se a pessoa digitar
"ola, tudo bem?"
ele vai inserir no db
no campo so que no para vai inserir e palavra todos
já se ela digitar
"/para Luiz Ola, tudo bem?"
vai inseir no db so que em para vai ser a palavra luiz.
como faço isso?
so não entendi como pegar o nome. tem como você pegar ele pra mim e deixar em uma variavel ai chamada $para?
Seria mais ou menos isso:
$mens = explode(' ','/para Alguem AAA');
$para = $mens[1];
O explode vai dividir a mensagem através dos espaços, gerando um array com três elementos. O segundo elemento desse array é passado para a variável para. Só tem um detalhe: o nome do usuário nunca pode ter espaços, senão ele só vai identificar o primeiro nome e a mensagem não vai chegar.
$msg = "/para Luiz Olá";
$exp = explode("/para", $msg);
$exp = explode(" ", $exp[1]);
$para = $exp[1];
echo $para;Pelas definições feitas no tópico #2, a solução do Wanderson até seria adequada, apenas com algumas alterações.
$msg = "/para Luiz Olá";
$exp = explode("/para", $msg);
$exp = explode(" ", ltrim($exp[1]));
$para = array_shift($exp);
$mensagem = implode(' ' , $exp);
printf("Para: %s\nMensagem: %s" , $para , $mensagem);
Mas, nesse caso, se um texto for muito grande, irá gerar um array imenso (dependendo da quantidade de espaços). Além de ser necessário utilizar a função implode para juntar a mensagem.
Eu faria de formas diferentes. Explode serve para separar textos, e não encontrar trechos dentro de um texto. Ele irá trabalhar em toda uma mensagem apenas para recuperar uma parte do início, e depois terá de juntar tudo para recuperar a mensagem.
Eu gosto muito de expressões regulares, é uma ferramenta extremamente poderosa. Entretanto, dessa vez vou me conter. Sem ERs, eu faria da seguinte maneira:
/ A mensagem /
$msg = "/para Luiz Essa é uma mensagem privada";
/**
Token que define quando é uma mensagem privada
Caso, um dia, você altere para outro tipo de token (ex.: "/to"),
basta alterar essa linha, e seu código funcionará perfeitamente **/
$token = "/para";
/ Recupera o tamanho do token /
$tamanhoToken = strlen($token);
/ Recupera a posição do início da mensagem /
$inicioMensagem = strpos($msg , ' ' , ($tamanhoToken + 1));
/ Recupera o usuário /
$para = trim(substr($msg , $tamanhoToken , ($inicioMensagem - $tamanhoToken) ));
/ Recupera a mensagem, removendo os espaços desnecessários /
$mensagem = ltrim(substr($msg , $inicioMensagem));
//Resultado final
printf("Para: %s\nMensagem: %s" , $para , $mensagem);
Esse código é um pouco maior que o apresentado pelos outros usuários, mas seria a forma mais lógica de se fazer. Evita alguns (de muitos) problemas que pode-se ter com explode. Já, com ERs:
$array = array();
preg_match('/^\/para[ ]*([\w_-]+) ([^\b]*)$/' , $msg , $array);
$para = $array[1];
$mensagem = $array[2];
printf("Para: %s\nMensagem: %s" , $para , $mensagem);
Ambos os casos, desde os exemplos anteriormente mencionados, irão funcionar. O mais interessante de tudo, é entender o que foi feito aqui. Em todos os exemplos.
Como dica final, apesar do meu primeiro código ser o maior de todos (além dos comentários), ele é o mais performático. Enquanto com ERs, a performance é menor, junto com o tamanho do código.
veja bem, você já andou um certo caminho. Padronizou um token (que já é comum em muitos chats).
Segundo vejo, você padronizou o espaço como sendo o seu token final.
Vamos a frase:
'/para Luiz Ola, tudo bem?'
Regras sobre a frase:
Nota: Eu não contei o primeiro espaço (entre "para" e "Luiz", pois ele não afeta em nada). Logo, isso:
'/paraLuiz'
é igual:
'/para Luiz'
Pois o token definido é:
'/para'
e não:
'/para '
Eu utilizaria expressões regulares para esse fim. Com algum conhecimento em ER, seria bem simples a solução. Para lhe dar o caminho, deixarei pronta expressão regular, o resto é seu.
if(preg_match('/^\/para[ ]{0,}([\w_-]+)/' , $mensagem )) {
//mensagem privada
} else {
//demais mensagens
}
Na ER, eu defini que buscara por qualquer mensagem que inicie com "/para", podendo possuir ou não " "(espaços em branco), seguido de qualquer tipo de palavra (letras, números, hifen e underline).