2009-02-18 24 views
147

Ich muss ein Leerzeichen in einem regulären PHP-Ausdruck zuordnen. Hat jemand irgendwelche Ideen?Ein Leerzeichen in Regex anpassen

Ich meine wie "Gavin Schulz", der Raum zwischen den beiden Wörtern. Ich verwende einen regulären Ausdruck, um sicherzustellen, dass ich nur Buchstaben, Zahlen und Leerzeichen zulasse. Aber ich bin mir nicht sicher, wie ich den Raum finden soll. Das ist es, was ich jetzt:

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

Hmm ... gibt es auch keine Frage über ein 'a' oder 'b' passenden ...;) – hop

+1

sollten Sie die [Regex Beispiele] (siehe http://stackoverflow.com/questions/16166819/php-regular-expressions) –

Antwort

261

Wenn Sie nach einem Platz suchen, das wäre " " (ein Raum) sein.

Wenn Sie sich für einen oder mehr suchen, ist es " *" (das ist zwei Räume und ein Sternchen) oder " +" (ein Raum und ein Plus).

Wenn Sie sich für gemeinsamen Abstand suchen, verwenden Sie "[ X]" oder "[ X][ X]*" oder "[ X]+" wo X das physische ist Tabulatorzeichen (und jeder wird von einem einzigen Raum in all diesen Beispielen voran).

Diese werden jeden * Regex-Engine in arbeite ich je gesehen habe (von denen einige nicht einmal die Ein-oder-mehr haben "+" Charakter, igitt).

Wenn Sie wissen, dass Sie eine der moderneren Regex-Engines verwenden werden, sind "\s" und seine Variationen der richtige Weg. Außerdem glaube ich, dass Wortgrenzen auch mit dem Anfang und Ende von Zeilen übereinstimmen. Dies ist wichtig, wenn Sie nach Wörtern suchen, die ohne vorangehende oder folgende Leerzeichen angezeigt werden.

Für PHP speziell kann this page helfen.

Von Ihrem bearbeiten, es scheint, dass Sie alle nicht gültigen Zeichen Beginn dieser entfernt werden soll (der Raum innerhalb der Regex beachten):

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

Wenn Sie auch Tricks, um sicherzustellen, wollen es nur einen Raum zwischen jedem Wort und keinem am Anfang oder Ende, das ist ein wenig komplizierter (und wahrscheinlich auch 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 
+0

Seine ursprüngliche Regex schien das Zeichen "" zu ersetzen. Sie verneinen den Raum, daher wird sein Raum nicht wie beabsichtigt "gelöscht". – Suroot

+0

Zitat: "nur Buchstaben, Zahlen und ein Leerzeichen erlaubt", Gavins ursprünglicher RE war falsch (weshalb er die Frage stellte). Mein RE löscht alles, was keiner von denen ist. – paxdiablo

+0

Warum muss der Raum am Ende des Match-Musters sein, statt etwa in der Mitte? – warren

5

In Perl ist der Schalter \s (Leerzeichen).

+3

Dies ist falsch - es sammelt alle Leerzeichen, nicht nur das Leerzeichen. –

3

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

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

EDIT Ändern dies ein Regex in Perl Beispiel sein

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

Erneut bearbeiten Basierend auf, was Sie wollen:

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

Es scheint mir wie die Verwendung eines REGEX in diesem Fall wäre einfach übertrieben. Warum nicht einfach nur strpos um das Leerzeichen zu finden. Außerdem gibt es nichts Besonderes an dem Leerzeichen in regulären Ausdrücken, Sie sollten in der Lage sein, nach demselben zu suchen, wie Sie nach einem anderen Zeichen suchen würden. Das heißt, es sei denn, Sie haben den Pattern-Whitespace deaktiviert, was in diesem Fall kaum notwendig wäre.

3

ich einen regulären Ausdruck verwenden, um sicherzustellen, dass ich erlauben nur Buchstaben, Zahl und ein Raum

Dann ist es so einfach ist, einen Raum als Zugabe zu dem, was haben Sie schon bekommen:

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

(Anmerkung, ich entfernte die s| die unbeabsichtigte schien? Natürlich war die s redundant; Sie können die | wiederherstellen, wenn Sie es brauchen)

Wenn Sie speziell * a * Raum wollen, wie in nur eine einzige, benötigen Sie einen komplexeren Ausdruck als diese, und könnte eine gesonderte, nicht berücksichtigen wollen -regex Stück der Logik.

0

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

1

Verwenden Sie es so, um einzelnen Speicherplatz zu ermöglichen.

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

Hier ist ein alles, was Sie brauchen, um über Leerzeichen in regulären Ausdrücken wissen:

  • [[:blank:]] Raum oder Tab nur
  • [[:space:]] Leer
  • \s Alle Leerzeichen
  • \v Vertikal Leerzeichen
  • \h Horizontal Leerzeichen
  • x Leerzeichen ignorieren
Verwandte Themen