Dopasowywanie spacji w wyrażeniu regularnym

229

Muszę dopasować znak spacji w wyrażeniu regularnym PHP. Czy ktoś ma jakieś pomysły?

Mam na myśli „gavin schulz”, przestrzeń pomiędzy dwoma słowami. Używam wyrażeń regularnych, aby upewnić się, że zezwalam tylko na litery, cyfry i spacje. Ale nie jestem pewien, jak znaleźć przestrzeń. Oto co mam teraz:

$newtag = preg_replace("/[^a-zA-Z0-9s|]/", "", $tag);
Gavin Schulz
źródło
2
Hmm ... nie ma również pytania o dopasowanie „a” lub „b” ...;)
1
powinieneś zobaczyć przykłady
wyrażeń

Odpowiedzi:

368

Jeśli szukasz miejsca, byłoby to " "(jedno miejsce).

Jeśli szukasz jednego lub więcej, jest to " *"(to dwie spacje i gwiazdka) lub " +"(jedna spacja i plus).

Jeśli szukasz wspólnego dystansowej, użytkowania "[ X]"lub "[ X][ X]*"lub "[ X]+"gdzie Xjest fizyczny znak tabulatora (i każda z nich jest poprzedzona pojedynczym odstępem we wszystkich tych przykładach).

Będą działać w każdym * silniku wyrażeń regularnych, jaki kiedykolwiek widziałem (niektóre z nich nie mają nawet jednej lub więcej "+"znaków, ugh).

Jeśli wiesz, że będziesz używać jednego z nowocześniejszych silników regex, "\s"a jego odmiany są odpowiednie. Ponadto uważam, że granice słów pasują również do początku i końca linii, co jest ważne, gdy szukasz słów, które mogą się pojawiać bez poprzedzania lub następowania spacji.

W przypadku PHP ta strona może pomóc.

Z edycji wydaje się, że chcesz usunąć wszystkie niepoprawne znaki. Początek jest następujący (zwróć uwagę na spację w wyrażeniu regularnym):

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

Jeśli chcesz także podstępu, aby upewnić się, że między każdym słowem jest tylko jedna spacja, a na początku lub na końcu nie ma, jest to nieco bardziej skomplikowane (i prawdopodobnie inne pytanie), ale podstawową ideą byłoby:

$newtag = preg_replace ("/ +/", " ", $tag); # convert all multispaces to space
$newtag = preg_replace ("/^ /", "", $tag);  # remove space from start
$newtag = preg_replace ("/ $/", "", $tag);  # and end
paxdiablo
źródło
Jego oryginalne wyrażenie regularne zdawało się chcieć zastąpić postać „”. Negujesz spację, dlatego jego spacja nie zostanie „usunięta” zgodnie z przeznaczeniem.
Suroot
Cytując: „zezwalaj tylko na litery, cyfry i spacje”, oryginalne RE Gavina było błędne (dlatego zadawał pytanie). Moje RE usuwa wszystko, co nie jest jednym z nich.
paxdiablo
Dlaczego miejsce musi znajdować się na końcu wzoru dopasowania zamiast, powiedzmy, w środku?
warren
1
@warren, nie ma. Komentarz „miejsce tutaj” nie wskazywał, dokąd poszła przestrzeń, a raczej stwierdzał, że jest tam miejsce (na wypadek, gdyby czytelnik nie zdawał sobie sprawy).
paxdiablo
@Mike, nie, tak nie jest. Chodzi tutaj o zastąpienie wszystkich znaków, których nie ma w zestawie A-Za-z.... Kreska w nawiasach kwadratowych narzuca to. Przeniesienie karetki poza nawiasy kwadratowe zmienia jego znaczenie na pasujące znaki w zestawie na początku łańcucha.
paxdiablo
34

Oto wszystko, co musisz wiedzieć o białych znakach w wyrażeniach regularnych:

  • [[:blank:]] Tylko spacja lub tabulator
  • [[:space:]] Biała przestrzeń
  • \s Dowolny znak spacji
  • \v Pionowe białe znaki
  • \h Pozioma biała spacja
  • x Zignoruj ​​białe znaki
Fletcher Ripp
źródło
5

Wydaje mi się, że użycie REGEX w tym przypadku byłoby po prostu przesadą. Dlaczego nie po prostu strpos, aby znaleźć znak spacji. Ponadto, nie ma nic specjalnego w znaku spacji w wyrażeniach regularnych, powinieneś być w stanie wyszukać go tak samo, jak każdego innego znaku. To znaczy, chyba że wyłączyłeś białe znaki wzorca, co w tym przypadku nie byłoby konieczne.

Kibee
źródło
5

W Perlu przełącznikiem jest \s(biała spacja).

Elsporko
źródło
16
Jest to niepoprawne - gromadzi wszystkie białe znaki, a nie tylko spację.
J. Taylor,
Ale pytanie jest oznaczone PHP, a nie Perlem.
Peter Mortensen,
4

Korzystam z wyrażenia regularnego, aby upewnić się, że zezwalam tylko na litery, cyfry i spacje

To jest tak proste, jak dodanie spacji do tego, co już masz:

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

(uwaga, usunąłem to, s|co wydawało się niezamierzone? Z pewnością sbyło zbędne; możesz je przywrócić, |jeśli potrzebujesz)

Jeśli chcesz konkretnie spacji * a *, tak jak tylko w jednym, potrzebujesz bardziej złożonego wyrażenia niż to i możesz rozważyć oddzielną logikę, która nie jest wyrażeniem regularnym.

Peter Boughton
źródło
3

Możesz także użyć \ b jako granicy słowa. Dla nazwy użyłbym czegoś takiego:

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

EDYCJA Modyfikowanie tego, aby było wyrażeniem regularnym w przykładzie Perla

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

PONOWNIE EDYCJA W zależności od tego, czego chcesz:

$new_tag = preg_replace("/[\s\t]/","",$tag);
Suroot
źródło
1

Próbuję [[: space:]] w instancji, w której wygląda na to, że blogerzy w WordPress używają niestandardowych znaków spacji. Wygląda na to, że zadziała.

Jeremy Schultz
źródło
1

Użyj go w ten sposób, aby umożliwić pojedyncze miejsce.

$newtag = preg_replace("/[^a-zA-Z0-9\s]/", "", $tag)
Ajay Singh
źródło