Ein Leerzeichen in Regex abgleichen

229

Ich muss ein Leerzeichen in einem regulären PHP-Ausdruck finden. Hat jemand irgendwelche Ideen?

Ich meine wie "gavin schulz" den Raum zwischen den beiden Wörtern. Ich verwende einen regulären Ausdruck, um sicherzustellen, dass ich nur Buchstaben, Zahlen und ein Leerzeichen zulasse. Aber ich bin mir nicht sicher, wie ich den Platz finden soll. Das habe ich gerade:

$newtag = preg_replace("/[^a-zA-Z0-9s|]/", "", $tag);
Gavin Schulz
quelle
2
Hmm ... es gibt auch keine Frage zum Abgleichen eines 'a' oder eines 'b' ...;)
1
Sie sollten die Regex-Beispiele sehen
T.Todua

Antworten:

367

Wenn Sie nach einem Leerzeichen suchen, ist dies " "(ein Leerzeichen).

Wenn Sie nach einem oder mehreren suchen, ist dies " *"(das sind zwei Leerzeichen und ein Sternchen) oder " +"(ein Leerzeichen und ein Plus).

Wenn Sie nach gemeinsamen Abständen suchen, verwenden Sie "[ X]"oder "[ X][ X]*"oder "[ X]+"wo Xbefindet sich das Zeichen der physischen Registerkarte (und in all diesen Beispielen steht vor jedem ein einzelnes Leerzeichen).

Diese funktionieren in jeder * Regex-Engine, die ich je gesehen habe (von denen einige nicht einmal den einen oder den mehreren "+"Charakter haben, ugh).

Wenn Sie wissen, dass Sie eine der moderneren Regex-Engines verwenden, sind "\s"deren Variationen der richtige Weg. Darüber hinaus glaube ich, dass Wortgrenzen auch mit Anfang und Ende von Zeilen übereinstimmen. Dies ist wichtig, wenn Sie nach Wörtern suchen, die möglicherweise ohne vorangestellte oder nachfolgende Leerzeichen erscheinen.

Speziell für PHP kann diese Seite hilfreich sein.

Es scheint, dass Sie aus Ihrer Bearbeitung alle ungültigen Zeichen entfernen möchten. Der Anfang ist (beachten Sie das Leerzeichen innerhalb der Regex):

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

Wenn Sie auch Tricks wollen, um sicherzustellen, dass zwischen jedem Wort und keinem am Anfang oder Ende nur ein Leerzeichen steht, ist das etwas komplizierter (und wahrscheinlich eine andere Frage), aber die Grundidee wäre:

$newtag = preg_replace ("/ +/", " ", $tag); # convert all multispaces to space
$newtag = preg_replace ("/^ /", "", $tag);  # remove space from start
$newtag = preg_replace ("/ $/", "", $tag);  # and end
paxdiablo
quelle
Sein ursprünglicher Regex schien den "" Charakter ersetzen zu wollen. Sie negieren das Leerzeichen, daher wird sein Leerzeichen nicht wie beabsichtigt "gelöscht".
Suroot
Zitat: "Erlaube nur Buchstaben, Zahlen und ein Leerzeichen", Gavins ursprünglicher RE war falsch (weshalb er die Frage stellte). Mein RE löscht alles, was nicht dazu gehört.
Paxdiablo
Warum muss sich das Leerzeichen am Ende des Übereinstimmungsmusters befinden, anstatt beispielsweise in der Mitte?
Warren
1
@ Warren, tut es nicht. Der Kommentar "Leerzeichen hier" gab nicht an, wohin das Leerzeichen ging, sondern dass dort ein Leerzeichen vorhanden war (falls der Leser es nicht bemerkte).
Paxdiablo
@ Mike, nein, das ist nicht der Fall. Hier sollen alle Zeichen ersetzt werden, die nicht im Satz enthalten sind A-Za-z.... Das Caret in den eckigen Klammern schreibt dies vor. Wenn Sie das Caret außerhalb der eckigen Klammern verschieben, ändert sich seine Bedeutung in übereinstimmende Zeichen im Satz am Anfang der Zeichenfolge.
Paxdiablo
34

Hier finden Sie alles, was Sie über Whitespace in regulären Ausdrücken wissen müssen:

  • [[:blank:]] Nur Leerzeichen oder Tabulator
  • [[:space:]] Leerzeichen
  • \s Beliebiges Leerzeichen
  • \v Vertikales Leerzeichen
  • \h Horizontales Leerzeichen
  • x Leerzeichen ignorieren
Fletcher Ripp
quelle
5

Es scheint mir, als wäre die Verwendung eines REGEX in diesem Fall einfach übertrieben. Warum nicht einfach nur versuchen , den Raumcharakter zu finden ? Außerdem ist das Leerzeichen in regulären Ausdrücken nichts Besonderes. Sie sollten in der Lage sein, danach zu suchen, genauso wie Sie nach einem anderen Zeichen suchen würden. Das heißt, es sei denn, Sie haben das Muster-Leerzeichen deaktiviert, was in diesem Fall kaum erforderlich wäre.

Kibbee
quelle
5

In Perl ist der Schalter \s(Leerzeichen).

Elsporko
quelle
16
Dies ist falsch - es werden alle Leerzeichen erfasst, nicht nur das Leerzeichen.
J. Taylor
Aber die Frage ist mit PHP markiert, nicht mit Perl.
Peter Mortensen
4

Ich verwende eine Regex, um sicherzustellen, dass ich nur Buchstaben, Zahlen und ein Leerzeichen zulasse

Dann ist es so einfach wie das Hinzufügen eines Leerzeichens zu dem, was Sie bereits haben:

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

(Beachten Sie, ich habe das entfernt, s|was unbeabsichtigt schien? Sicher swar das überflüssig; Sie können das wiederherstellen, |wenn Sie es brauchen)

Wenn Sie speziell * ein * Leerzeichen möchten, wie in nur einem einzigen, benötigen Sie einen komplexeren Ausdruck als diesen und möchten möglicherweise ein separates Stück Nicht-Regex-Logik in Betracht ziehen.

Peter Boughton
quelle
3

Sie können auch \ b für eine Wortgrenze verwenden. Für den Namen würde ich so etwas verwenden:

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

BEARBEITEN Ändern Sie dies so, dass es im Perl-Beispiel ein regulärer Ausdruck ist

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

WIEDER BEARBEITEN Basierend auf dem, was Sie wollen:

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

Ich probiere [[: space:]] in einer Instanz aus, in der es so aussieht, als würden Blogger in WordPress nicht standardmäßige Leerzeichen verwenden. Es sieht so aus, als würde es funktionieren.

Jeremy Schultz
quelle
1

Verwenden Sie es so, um einen einzelnen Platz zuzulassen.

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