2010-11-17 3 views
6

Je suis en train d'enlever tout ce qui est pas alphanumérique, ou est un espace _:espaces Retrait et tout ce qui est qu'alphanumériques

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

Qu'est-ce que je fais mal ici, il ne semble pas travail. J'ai essayé plusieurs combinaisons de regex ... (et je ne suis généralement pas très brillant).

+0

Je suis un peu confused-- voulez-vous remplacer les espaces par "_" ou non? – climbage

+0

Eh bien, pour une chose que vous avez réussi à négliger quelques caractères: ''unichars -a '[\ p {Alpha} \ p {Numéro}]' '[^ a-zA-Z0-9]' | wc -l' == 14717'. Pas un bon endroit pour commencer. – tchrist

+0

Vous devez mettre le '\ s' entre crochets. Autrement '^ \ s' correspond juste aux espaces blancs au début'^'du sujet. Utilisez également '/../' pour l'encadrement, les parenthèses rondes sont seulement pour la capture. – mario

Répondre

11

Essayez ceci:

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

Je suggère de comptabiliser les autres presque 15000 caractères que vous avez oublié. – tchrist

+0

Regex ne prend pas en compte les caractères Unicode valides – stillstanding

0

Essayez

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

Wow. Euh, comme quoi est ce '\ s' qui fait * dehors * la classe de personnage? Et les milliers d'alphanumériques que vous avez oubliés, hein? – tchrist

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

Si je comprends bien votre question, vous voulez remplacer tout l'espace (\ s) ou non alphanumérique (\ W) personnage avec un '_'. Cela devrait bien se passer. Notez que \ W est en majuscule, par opposition à minuscule \ w qui correspondrait aux caractères alphanumériques.

+2

La signification de '\ W' varie d'une saveur à l'autre, mais en PHP elle correspond à n'importe quel caractère qui n'est pas un caractère ASCII, c'est-à-dire' [A-Za-z0-9_] '. Cela inclut les caractères d'espaces ASCII (donc le '\ s' est redondant) et les caractères alphanumériques des autres scripts. Même les lettres latines accentuées sont considérées comme des caractères non-mots par '\ W'. –

2

La solution qui fonctionne pour moi est:

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

Les blocs + matches d'un ou plusieurs occurences des espaces \W qui comprend des espaces et tous les caractères non-alphanumériques

Questions connexes