Reconhecendo Strings da caixa de Notas

3 Respostas   76 Visualizações

0 Membros e 1 Visitante estão vendo este tópico.

Corvo

Tópico criado em: 10/06/2017 às 13:26 - Última modificação por Corvo em 10/06/2017 às 17:15

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:
[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
[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.

Syureri

Resposta 1: 10/06/2017 às 17:09 - Última modificação por Alisson em 10/06/2017 às 17:26

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:
Código: [Selecionar]
/category:\s+?(.*)>/ipode ser traduzida da seguinte forma.
Código: [Selecionar]
\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?*.

Corvo

Resposta 2: 10/06/2017 às 17:26

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

Syureri

Resposta 3: 10/06/2017 às 17:29 - Última modificação por Alisson em 10/06/2017 às 17:33

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.