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];
}
Foi útil?

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+) (.+)/;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top