Correspondendo a um Espaço na Regex

229

Preciso combinar um caractere de espaço em uma expressão regular do PHP. Alguém tem alguma idéia?

Quero dizer como "gavin schulz", o espaço entre as duas palavras. Estou usando uma expressão regular para garantir que apenas permita letras, número e espaço. Mas não sei como encontrar o espaço. Isto é o que eu tenho agora:

$newtag = preg_replace("/[^a-zA-Z0-9s|]/", "", $tag);
Gavin Schulz
fonte
2
Hmm ... também não há dúvida sobre a correspondência de um 'a' ou 'b' ...;)
1
você deve ver os exemplos de regex
T.Todua

Respostas:

368

Se você está procurando um espaço, isso seria " "(um espaço).

Se você estiver procurando por um ou mais, é " *"(são dois espaços e um asterisco) ou " +"(um espaço e um plus).

Se você estiver procurando por espaçamento comum, use "[ X]"ou "[ X][ X]*"ou "[ X]+"onde Xé o caractere de tabulação físico (e cada um é precedido por um único espaço em todos esses exemplos).

Eles funcionarão em todos os * mecanismos regex que eu já vi (alguns dos quais nem têm o um ou mais"+" caráter de , ugh).

Se você sabe que usará um dos mecanismos regex mais modernos, "\s"e suas variações são o caminho a percorrer. Além disso, acredito que os limites das palavras também correspondem ao início e ao fim das linhas, importante quando você procura palavras que possam aparecer sem espaços precedentes ou seguintes.

Para o PHP especificamente, esta página pode ajudar.

Na sua edição, parece que você deseja remover todos os caracteres inválidos. O início é (observe o espaço dentro da regex):

$newtag = preg_replace ("/[^a-zA-Z0-9 ]/", "", $tag);
#                                    ^ space here

Se você também quiser que os truques garantam que exista apenas um espaço entre cada palavra e nenhuma no início ou no final, isso é um pouco mais complicado (e provavelmente outra pergunta), mas a idéia básica seria:

$newtag = preg_replace ("/ +/", " ", $tag); # convert all multispaces to space
$newtag = preg_replace ("/^ /", "", $tag);  # remove space from start
$newtag = preg_replace ("/ $/", "", $tag);  # and end
paxdiablo
fonte
Sua regex original parecia querer substituir o caracter "". Você está negando o espaço, portanto, o espaço dele não será "excluído" como pretendido.
Suroot 18/02/09
Citando: "apenas permita letras, número e espaço", o ER original de Gavin estava errado (e é por isso que ele estava fazendo a pergunta). Meu ER exclui tudo o que não é um desses.
paxdiablo
Por que o espaço precisa estar no final do padrão de correspondência em vez de, digamos, no meio?
Warren
1
@warren, não. O comentário 'espaço aqui' não indicava para onde ia o espaço, mas dizia que havia um espaço ali (caso o leitor não percebesse).
precisa
@ Mike, não, não é esse o caso. A intenção aqui é substituir todos os caracteres que não estão no conjunto A-Za-z.... O sinal de intercalação dentro dos colchetes determina isso. Mover o cursor para fora dos colchetes muda seu significado para caracteres correspondentes no conjunto no início da string.
paxdiablo
34

Aqui está tudo o que você precisa saber sobre espaço em branco em expressões regulares:

  • [[:blank:]] Apenas espaço ou tabulação
  • [[:space:]] Espaço em branco
  • \s Qualquer caractere de espaço em branco
  • \v Espaço em branco vertical
  • \h Espaço em branco horizontal
  • x Ignorar espaço em branco
Fletcher Ripp
fonte
5

Parece-me que usar um REGEX nesse caso seria apenas um exagero. Porque não basta apenas strpos para encontrar o caractere de espaço. Além disso, não há nada de especial no caractere de espaço em expressões regulares; você deve procurá-lo da mesma forma que pesquisaria qualquer outro caractere. Ou seja, a menos que você desabilite o espaço em branco do padrão, o que dificilmente seria necessário nesse caso.

Kibbee
fonte
5

No Perl, o comutador é \s(espaço em branco).

Elsporko
fonte
16
Isso está incorreto - reúne todo o espaço em branco, não apenas o caractere de espaço.
J. Taylor
Mas a questão está marcada com PHP, não Perl.
Peter Mortensen
4

Estou usando uma regex para garantir que eu permita apenas letras, número e espaço

Então é tão simples quanto adicionar um espaço ao que você já tem:

$newtag = preg_replace("/[^a-zA-Z0-9 ]/", "", $tag);

(observe, eu removi o s|que parecia não intencional? Certamente isso sera redundante; você pode restaurar o| se precisar)

Se você deseja especificamente um espaço * a *, como em apenas um único, precisará de uma expressão mais complexa que essa e poderá considerar uma parte lógica diferente da não-regex.

Peter Boughton
fonte
3

Você também pode usar o \ b para um limite de palavras. Para o nome eu usaria algo como isto:

[^\b]+\b[^\b]+(\b|$)

EDIT Modificando isso para ser uma regex no exemplo Perl

if( $fullname =~ /([^\b]+)\b[^\b]+([^\b]+)(\b|$)/ ) {
 $first_name = $1;
 $last_name = $2;
}

EDITAR NOVAMENTE Com base no que você deseja:

$new_tag = preg_replace("/[\s\t]/","",$tag);
Suroot
fonte
1

Estou testando [[: space:]] em uma instância em que parece que blogueiros no WordPress estão usando caracteres de espaço não padrão. Parece que vai funcionar.

Jeremy Schultz
fonte
1

Use-o assim para permitir espaço único.

$newtag = preg_replace("/[^a-zA-Z0-9\s]/", "", $tag)
Ajay Singh
fonte