/ Sintaxe regex PM para o envio de mensagem no chat room-
-
19-09-2019 - |
Pergunta
Eu estou trabalhando em uma sala de chat AJAX / PHP e atualmente estou preso no regex para detectar se um usuário tiver enviar um PM e, em seguida, trabalhar fora, que é muito e qual é a mensagem.
Se o usuário digita algo como
/ pm PezCuckow Hi Lá você tão incrível!
Gostaria de primeiro teste se a minha string combinada esse padrão, em seguida, obter 'PezCuckow' e 'Hi Lá você tão incrível!' como cordas para enviar para o PHP.
Eu fiz alguma pesquisa sobre regex, mas realmente não tenho idéia por onde começar com este! Pode você ajudar?
== Obrigado a todos ajuda isso agora está resolvido! ==
var reg = /^\/pm\s+(\w+)\s+(.*)$/i;
var to = "";
if(message.match(reg)) {
m = message.match(reg);
to = m[1];
message = m[2];
}
Solução
Hows sobre este:
var reg = /^\/pm\s+(\w+)\s+(.*)$/i,
m = '/pm PezCuckow Hi There you so awesome!'.match(reg);
m[0]; // "PezCuckow"
m[1]; // "Hi There you so awesome!"
que corresponde "/pm"
seguido por " "
espaço em branco (liberalmente aceitar espaços extras), seguido pelo \w+
nome de usuário, seguido por espaço em branco " "
agin, então, finalmente, o .*
mensagem (que é basicamente tudo para o fim da linha).
Outras dicas
Este regex analisa uma mensagem:
^(?:\s*/(\w+)\s*(\w*)\s*)?((?:.|[\r\n])*)$
Explicação:
^ # start-of-string
(?: # start of non-capturing group
\s*/ # a "/", preceding whitespace allowed
(\w+) # match group 1: any word character, at least once (e.g. option)
\s+ # delimiting white space
(\w*) # match group 2: any word character (e.g. target user)
\s+ # delimiting white space
)? # make the whole thing optional
( # match group 3:
(?: # start of non-capturing group, either
. # any character (does not include newlines)
| # or
[\r\n] # newline charaters
)* # repeat as often as possible
) # end match group 3
No seu caso ("/pm PezCuckow Hi There you so awesome!"
):
- grupo 1: "pm"
- grupo 2: "PezCuckow"
- grupo 3: "Oi Lá você tão incrível"
em um caso mais geral ("Hi There you so awesome!"
)
- grupo 1: ""
- grupo 2: ""
- grupo 3: "Oi Lá você tão incrível"
Note que as necessidades barra para ser escapado em literais regex JavaScript:
/foo\/bar/
mas não no padrão regex em geral.
Assumindo que apenas caracteres de texto (sem espaços, etc.) são válidos no campo de nome, este vai fazer o que quiser:
var re = /(\/\w+) (\w+) (.+)/;