O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Reconhecendo Strings da caixa de Notas

Iniciado por Corvo, 10/06/2017 às 13:26

10/06/2017 às 13:26 Última edição: 10/06/2017 às 17:15 por Corvo
Estive pensando em substituir o ItemCategory do Ace. A dúvida é a seguinte: como eu reconheço algo escrito na caixa de notas de um item? Para exemplificar, eu estava pensando no seguinte: utilizar uma array para definir as categorias:
itemCategory = ["NomeA", "NomeB", "NomeC", "NomeD" ... ]
[close]
Primeiro, pensei em colocar cada categoria como outra array, contendo os IDs de itens específicos, mas ficaria uma confusão. Então, na teoria, achei que assim ficaria melhor:
Nem sei se isso aqui é possível
itemCategory = [
itens = ["Itens", "Pedras e Cristais"],
boticário = ["Elixires", "Ervas e Raízes"],
armas = ["Espadas", "Machados", "Cajados", "Lanças e Alabardas", "Arcos e Balestras", "Armas de Punho"],
equipamentos = ["Coletes", "Armaduras", "Elmos e Capacetes", "Escudos", "Botas", "Luvas e Braçadeiras"],
vestimentas = ["Vestes Nobres", "Vestes Rudimentares", "Coroas e Diademas"],
acessórios = ["Anéis", "Colares", "Amuletos"],
]
[close]
Ainda teoricamente, como faria para incluir cada item em sua categoria? A ideia é só colocar um "Nome_da_Categoria" na caixa de notas dos itens, mas como reconhecer o que está escrito ali? Enfim, é todo um tópico que poderia ser resumido assim: como reconhecer quando há algo na caixa de notas? E como reconhecer esse valor, quando houver? De toda forma é só uma dúvida aleatória.

10/06/2017 às 17:09 #1 Última edição: 10/06/2017 às 17:26 por Alisson
Estou ansioso para lançar a aula de Expressões Regulares (ou Regex, para encurtar).
Para acessar a caixa de notas de um item no database, basta usar: $data_items[n].note.

Primeiramente vou criar uma tag no campo de notas do primeiro item. Eu gosto de separar as tags entre <>, pois fica fácil de saber onde começa e termina a tag. Mas pode fazer da maneira que preferir.
Spoiler
[close]

Veja como eu acesso o conteúdo daquela tag num chamar script:
Spoiler
[close]

Agora permita-me explicar.
Na primeira linha, estamos checando se a string que obtivemos na caixa de notas combina com a expressão regular que passamos, usando o operador especial: =~ (match).
A expressão regular:
/category:\s+?(.*)>/i

pode ser traduzida da seguinte forma.
\s = qualquer espaço.
\s+ = um ou qualquer espaço a mais.
\s+? um ou qualquer espaço a mais, porém não necessário.
() = pegar todo o resto junto.
. = qualquer caractere, qualquer caractere mesmo.
.* zero ou mais de qualquer caractere.

O i no final da expressão é uma opção especial, que indica que o conteúdo da expressão não precisa ser case-sensitive. Ela pode estar tanto maiúscula quanto minúscula.

Caso a string combinar com nossa expressão, o resultado será salvo em umas variáveis globais criadas pelo sistema, que no caso são: $1, $2, $3... $13 e por aí vai.
Essas variáveis globais indicam as combinações, caso haja mais de uma combinação, você pode acessar a segunda usando $2 (por isso não é bom usar variáveis globais comumente).
Vale lembrar que essas variáveis globais irão mudar sempre que você testar outras combinações.

Para mais informações sobre expressões regulares, você pode acessar o Rubular.
O Rubular foi criado em ruby, mas vale lembrar que as expressões regulares são as mesmas na maioria das linguagens.

Obs: Todo o resultado será retornado como uma string, então se você quiser um número inteiro, converta usando to_i.

Edit: Notei um problema na expressão usada no exemplo. O certo de \s+? seria \s?*.

Perfeito, sr.[user]Alisson[/user]. Só um esclarecimento: como eu identifico os '<' '>'? São as barrinhas da fórmula?

10/06/2017 às 17:29 #3 Última edição: 10/06/2017 às 17:33 por Alisson
Os <> são usados apenas para delimitar o início e o fim da sequência de combinações. Caso não haja um início determinado, ele irá começar do exato começo da nota, e irá até o exato fim da nota (o que é um problema caso hajam diversas tags diferentes no campo de notas).
Na verdade você pode usar qualquer coisa para delimitar o início e fim.