2010-11-17 10 views
6

Próbuję usunąć wszystko, co nie jest alfanumeryczny, albo jest przestrzenią z _:usunięcie spacji i wszystko, co nie jest alfanumeryczny

$filename = preg_replace("([^a-zA-Z0-9]|^\s)", "_", $filename); 

Co robię źle tutaj, to nie wydaje się praca. Próbowałem kilka kombinacji regex ... (i generalnie nie jestem bardzo jasny).

+0

jestem lekko confused-- czy chcesz zamienić spacje na "_" czy nie? – climbage

+0

Po pierwsze, udało ci się zaniedbać kilka znaków: ''unichars -a '[\ p {Alpha} \ p {Number}]' '[^ a-zA-Z0-9]' | wc -l' == 14717'. To nie jest dobre miejsce do rozpoczęcia. – tchrist

+0

Powinieneś umieścić '\ s' w nawiasach kwadratowych. W przeciwnym razie '^ \ s' dopasowuje tylko białe spacje na początku'^'tematu. Używaj również '/../' do zamykania, nawiasy okrągłe służą tylko do przechwytywania. – mario

Odpowiedz

11

Spróbuj tego:

$filename = preg_replace("/[^a-zA-Z0-9 ]/", "_", $filename); 
+1

Proponuję uwzględnić pozostałe prawie 15000 znaków, o których zapomniałeś. – tchrist

+0

Regex nie bierze pod uwagę ważnych znaków Unicode. – stillstanding

0

Spróbuj

$filename = preg_replace("/[a-zA-Z0-9]|\s/", "_", $filename); 
+0

Wow. Um, jak to jest, że '\ s' robi * poza * klasą postaci? A co z tysiącami alfanumerycznych, o których zapomniałeś, co? – tchrist

7
$filename = preg_replace('~[\W\s]~', '_', $filename); 

Jeśli rozumiem Twoje pytanie poprawnie, chcesz zastąpić dowolną przestrzeń (\ s) lub bez alfanumerycznych (\ w) postać z "_". To powinno dobrze. Zauważ, że \ W jest wielką literą, w przeciwieństwie do małych liter \ w, które pasowałyby do znaków alfanumerycznych.

+2

Znaczenie '\ W' zmienia się od jednego smaku do drugiego, ale w PHP pasuje do dowolnego znaku, który nie jest znakiem słownym ASCII, tj.' [A-Za-z0-9_] '. Obejmuje to znaki białe ASCII (więc '' s' jest zbędny) i znaki alfanumeryczne z innych skryptów. Nawet akcentowane litery łacińskie są uważane za znaki niesłyszalne przez "\ W". –

2

Rozwiązanie, które działa dla mnie jest:

$filename = preg_replace('/\W+/', '_', $filename); 

The + dopasowania bloków jednego lub więcej wystąpień \W spacji, która obejmuje wszystkie spacje i znaki inne niż alfanumeryczne

Powiązane problemy