Estou tendo problemas para verificar no PHP se um valor é uma das seguintes combinações
- letras (maiúsculas ou minúsculas)
- números (0-9)
- sublinhado (_)
- traço (-)
- ponto (.)
- sem espaços! ou outros personagens
alguns exemplos:
- OK: "screen123.css"
- OK: "screen-new-file.css"
- OK: "screen_new.js"
- NÃO OK: "tela de novo arquivo.css"
Acho que preciso de uma regex para isso, pois preciso lançar um erro quando uma string dada contém outros caracteres além dos mencionados acima.
Respostas:
O padrão que você deseja é algo como ( veja em rubular.com ):
Explicação:
^
é o começo da âncora de linha$
é a âncora do fim da linha[...]
é uma definição de classe de personagem*
é a repetição "zero ou mais"Observe que o traço literal
-
é o último caractere na definição da classe de caracteres, caso contrário, tem um significado diferente (ou seja, intervalo). O.
também tem um significado diferente fora das definições de classe de caractere, mas por dentro, é apenas um literal.
Referências
Em PHP
Aqui está um snippet para mostrar como você pode usar este padrão:
As impressões acima ( conforme visto em ideone.com ):
Observe que o padrão é ligeiramente diferente, usando em seu
\w
lugar. Esta é a classe de caractere para "caractere de palavra".Referências API
preg_match
Nota na especificação
Isso parece seguir sua especificação, mas observe que corresponderá a itens como
.....
etc., que podem ou não ser o que você deseja. Se você puder ser mais específico sobre qual padrão deseja corresponder, a regex será um pouco mais complicada.O regex acima também corresponde à string vazia. Se você precisar de pelo menos um caractere, use
+
(um ou mais) em vez de*
(zero ou mais) para a repetição.Em qualquer caso, você pode esclarecer ainda mais sua especificação (sempre ajuda ao fazer perguntas sobre regex), mas espero que você também possa aprender como escrever o padrão com as informações acima.
fonte
^/([a-zA-Z0-9._-]*\.html)$
/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+){2,}[a-zA-Z0-9^]$/
false
literais de string brutos vazios. Playground . Use a solução de @ nonopolarity abaixo .você pode usar
o
+
é para se certificar de que tem pelo menos 1 personagem. Precisa de^
e$
para denotar o início e o fim, caso contrário, se a string tiver uma correspondência no meio, como@@@@xyz%%%%
então ainda é uma correspondência.fonte
-
primeiro no conjunto, para evitar definir um intervalo. E\w
cobre alfanuméricos e sublinhados. Então você precisa[\w.-]+
.Para realmente cobrir seu padrão, ou seja, nomes de arquivo válidos de acordo com suas regras, acho que você precisa de um pouco mais. Observe que isso não corresponde aos nomes de arquivo legais da perspectiva do sistema . Isso seria dependente do sistema e mais liberal no que aceita. O objetivo é corresponder aos seus padrões aceitáveis.
Explicação:
^
Corresponde ao início de uma string. Isso (mais a correspondência final) força a string a se adequar à expressão exata, não apenas a conter uma substring que corresponda à expressão.([a-zA-Z0-9]+[_-])*
Zero ou mais ocorrências de uma ou mais letras ou números seguidos por um sublinhado ou travessão. Isso faz com que todos os nomes que contêm um traço ou sublinhado tenham letras ou números entre eles.[a-zA-Z0-9]+
Uma ou mais letras ou números. Isso cobre todos os nomes que não contêm sublinhado ou travessão.\.
Um período literal (ponto). Força o nome do arquivo a ter extensão e, por exclusão do resto do padrão, permite que seja utilizado apenas o ponto final entre o nome e a extensão. Se você quiser mais de uma extensão, que também pode ser tratada usando a mesma técnica do traço / sublinhado, apenas no final.[a-zA-Z0-9]+
Uma ou mais letras ou números. A extensão deve ter pelo menos um caractere e deve conter apenas letras e números. Isso é típico, mas se você quiser permitir sublinhados, isso também pode ser resolvido. Você também pode fornecer um intervalo de comprimento em{2,3}
vez de um ou mais+
combinadores, se for mais apropriado.$
Combine o final da string. Veja o personagem inicial.fonte
Este é o padrão que você está procurando
O que isto significa:
^
Início da corda[...]
Corresponder caracteres dentro\w
Qualquer palavra então0-9
a-z
A-Z
-_.
Combinar-
e_
e.
*
Zero ou mais do padrão ou ilimitado$
Fim da cordaSe você deseja limitar a quantidade de caracteres:
{0,5}
Significa0-5
personagensfonte
\w
inclui_
Algo assim deve funcionar
Isso irá ecoar "não é válido"
fonte
[A-Za-z0-9_.-]*
Isso também corresponderá a strings vazias, se você não quiser que troque o último
*
por um+
fonte