Abbinamento di uno spazio in regex


229

Devo abbinare un personaggio spaziale in un'espressione regolare di PHP. Qualcuno ha qualche idea?

Intendo come "Gavin Schulz", lo spazio tra le due parole. Sto usando un'espressione regolare per assicurarmi di consentire solo lettere, numeri e spazi. Ma non sono sicuro di come trovare lo spazio. Questo è quello che ho adesso:

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

2
Hmm ... non ci sono anche domande sulla corrispondenza di una 'a' o una 'b' ...;)

1
dovresti vedere gli esempi di regex
T.Todua,

Risposte:


368

Se stai cercando uno spazio, sarebbe " "(uno spazio).

Se stai cercando uno o più, è " *"(ovvero due spazi e un asterisco) o " +"(uno spazio e un plus).

Se stai cercando una spaziatura comune, usa "[ X]"o "[ X][ X]*"o "[ X]+"dove si Xtrova il carattere della scheda fisica (e ciascuno è preceduto da un singolo spazio in tutti quegli esempi).

Funzioneranno in tutti i * motori regex che abbia mai visto (alcuni dei quali non hanno nemmeno l'uno o più "+"personaggi, ugh).

Se sai che utilizzerai uno dei motori regex più moderni "\s"e le sue varianti sono la strada da percorrere. Inoltre, credo che i confini delle parole corrispondano anche all'inizio e alla fine delle righe, importante quando cerchi parole che potrebbero apparire senza spazi precedenti o seguenti.

In particolare per PHP, questa pagina può essere d'aiuto.

Dalla tua modifica, sembra che tu voglia rimuovere tutti i caratteri non validi L'inizio di questo è (nota lo spazio all'interno della regex):

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

Se vuoi anche dei trucchi per assicurarti che ci sia solo uno spazio tra ogni parola e nessuna all'inizio o alla fine, è un po 'più complicato (e probabilmente un'altra domanda) ma l'idea di base sarebbe:

$newtag = preg_replace ("/ +/", " ", $tag); # convert all multispaces to space
$newtag = preg_replace ("/^ /", "", $tag);  # remove space from start
$newtag = preg_replace ("/ $/", "", $tag);  # and end

La sua regex originale sembrava voler sostituire il "" personaggio. Stai negando lo spazio, quindi il suo spazio non verrà "cancellato" come previsto.
Suroot,

Citando: "consenti solo lettere, numeri e spazi", la RE originale di Gavin era sbagliata (motivo per cui stava ponendo la domanda). Il mio RE elimina tutto ciò che non è uno di quelli.
paxdiablo,

Perché lo spazio deve trovarsi alla fine del modello di corrispondenza anziché, ad esempio, nel mezzo?
warren

1
@warren, non lo fa. Il commento "spazio qui" non indicava dove fosse andato lo spazio, ma piuttosto affermava che lì c'era uno spazio (nel caso in cui il lettore non se ne rendesse conto).
paxdiablo

@ Mike, no, non è così. L'intento qui è quello di sostituire tutti i personaggi che non sono nel set A-Za-z.... Il cursore tra parentesi quadre lo impone. Spostare il cursore fuori dalle parentesi quadre cambia il suo significato in corrispondenza dei caratteri nel set all'inizio della stringa.
paxdiablo,


34

Ecco tutto ciò che devi sapere sugli spazi bianchi nelle espressioni regolari:

  • [[:blank:]] Solo spazio o scheda
  • [[:space:]] Lo spazio bianco
  • \s Qualsiasi carattere di spazio bianco
  • \v Spazi bianchi verticali
  • \h Spazi bianchi orizzontali
  • x Ignora spazi bianchi

5

Mi sembra che usare un REGEX in questo caso sarebbe eccessivo. Perché non solo strpos per trovare il personaggio spaziale. Inoltre, non c'è nulla di speciale nel personaggio spaziale nelle espressioni regolari, dovresti essere in grado di cercarlo come se dovessi cercare qualsiasi altro personaggio. Cioè, a meno che tu non abbia disabilitato gli spazi bianchi del modello, che difficilmente sarebbero necessari in questo caso.


5

In Perl l'interruttore è \s(spazi bianchi).


16
Questo non è corretto: raccoglie tutti gli spazi bianchi, non solo il carattere dello spazio.
J. Taylor,

Ma la domanda è taggata con PHP, non Perl.
Peter Mortensen,

4

Sto usando una regex per assicurarmi di consentire solo lettere, numeri e spazi

Quindi è semplice come aggiungere uno spazio a ciò che hai già:

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

(nota, ho rimosso ciò s|che sembrava non intenzionale? Certamente sera ridondante; puoi ripristinarlo |se ne hai bisogno)

Se si vuole specificamente * * uno spazio, come in solamente uno solo, avrete bisogno di un'espressione più complessa, e potrebbe prendere in considerazione un pezzo non regex separata della logica.


3

Puoi anche usare \ b per un limite di parole. Per il nome userei qualcosa del genere:

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

EDIT Modificandolo come regex nell'esempio Perl

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

MODIFICA ANCORA In base a ciò che vuoi:

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

1

Sto provando [[: space:]] in un'istanza in cui sembra che i blogger in WordPress utilizzino caratteri spaziali non standard. Sembra che funzionerà.


1

Usalo in questo modo per consentire spazio singolo.

$newtag = preg_replace("/[^a-zA-Z0-9\s]/", "", $tag)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.