Niveau
..........
En rapport...

Filtrage de caractères

Il se peut que vous deviez supprimer tous les caractères spéciaux d'une chaîne…
Par exemple, pour être sûr que votre chaîne est un nom de fichier valide (sans accents, sans slash ou autre fioriture…

Voici une petite fonction basée sur les expressions régulière qui va “nettoyer” votre chaîne.

code

php
function filter($in) {
	$search = array ('@[éèêëÊË]@i','@[àâäÂÄ]@i','@[îïÎÏ]@i','@[ûùüÛÜ]@i','@[ôöÔÖ]@i','@[ç]@i','@[ ]@i','@[^a-zA-Z0-9_]@');
	$replace = array ('e','a','i','u','o','c','_','');
	return preg_replace($search, $replace, $in);
}

Fonctionnement

La variable $search est un tableau qui correspond à des expressions régulières.
$replace est la correspondance…
Par exemple :
[éèêëÊË] sera remplacé par “e”

on remarque un “i” après le @ de fin de chaque expression.
Il s'agit du commutateur “insensible a la casse”
Pas fondamentalement utile ici mais on ne sait jamais.

La dernière expression ([^a-zA-Z0-9_]) est différente.
Après avoir remplacé tous les caractères accentué par leur équivalent et les espace par des underscores on par du principe que tous caractères autre que alphanumérique est à supprimer. C'est le rôle de cette expression.


iDo 26/04/2006 17:08

Discussion

Thewhitdwarf, 18/04/2007 16:43:

Au sujet de la syntaxe des expressions régulières pourriez vous me dire quelle est votre source pour avoir trouvé que @[...]@ exprimait l’ensemble de l’alternative des caracteres contenus dans les [ ] et remplacait les bonnes vieilles barres d’alternative(|).

J’ai cherché dans les abysses du net et je n’ai meme pas trouvé sur

http://www.expreg.com/

Qu’appelez vous commutateur “insensible à la casse” ? Dans quel cas sert-il.

Dsl pour mon ignorance mais cela m’intrique fortement :).

Cordialement,

Thewhitdwarf

 
iDo, 18/04/2007 17:06:

salut, en fait @[...]@ est une syntaxe propre a php.
c’est équivalent a /[...]/
En gros, en php, l’expression régulière doit être inclue entre 2 caractères identiques (ici l’@ ).
En général on utilise un caractère qui n’apparait pas dans l’expression régulière (pour éviter d’avoir à l’échapper).
Le commutateur “insensible a la casse” est le i qui se trouve après le dernier @.
Par exemple :
pour “@[a-c]+@i”, les chaines AbC, ABC, abc sont valide.
en revanche :
pour “@[a-c]+@”, seul abc est valide.
Il existe plusieurs autres commutateurs.

:) iDo

 
Tang, 06/12/2007 01:14:

Nickel ton script !! un grand merci

 
totoduweb, 11/12/2007 21:41:

MERCI !

 
NICOLAS, 20/12/2007 15:39:

vraiment bien ce pti bout de code ;) par contre si je mets en '-' a la place du underscore ca ne marche pas pourquoi ?

 
iDo, 20/12/2007 15:53:

Si c'est dans l'expression régulière, il faut échapper le - avec \ comme ceci : \-

 
Nicolas, 16/01/2008 19:07:

J'ai le même problème que NICOLAS : le caractère espace n'est pas remplacé, ni le caractère “ç”. Une idée ? Merci pour ce très bon script :)

 
Nicolas, 16/01/2008 19:26:

C'est bon, problème résolu ! Ma chaîne de caractères était encodée en UTF8.

Ce script est assez magique, merci encore.

 
jhd, 24/01/2008 22:33:

j ai un probleme, le é est remplacé par deux ee les î par ei etc

voici un screen http://www.netimago.com/image_397.html

pourriez m aider svp

 
kryogen, 21/03/2008 12:45:

Attention d'autres lettres peuvent aussi être accentuées : àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ.

Une autre méthode, (peut-être) moins gourmande en terme de ressources :

$string_without_accent = strstr( $String, 'àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ', 'aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY' ) );

Par contre cette dernière ne supprime pas les caractères spéciaux…

S@M…

 
H.CH, 20/05/2008 09:13:

Combinaison des deux solutions et merci

function filter($in) {

//$search = array ('@[éèêëÊË]@i','@[àâäÂÄ]@i','@[îïÎÏ]@i','@[ûùüÛÜ]@i','@[ôöÔÖ]@i','@[ç]@i','@[ ]@i','@[^a-zA-Z0-9_]@');

$search = array ('@[éèêëÊË]@i','@[áãàâäÂÄ]@i','@[ìíiiîïÎÏ]@i','@[úûùüÛÜ]@i','@[òóõôöÔÖ]@i','@[ñÑ]@i','@[ýÿÝ]@i','@[ç]@i','@[ ]@i');

$replace = array ('e','a','i','u','o','n','y','c','_');
return preg_replace($search, $replace, $in);

}

 
H.CH, 20/05/2008 09:17:

dernière version

php
 
function filter($in) {
 
 
 
$search = array ('@[éèêëÊË]@i','@[áãàâäÂÄ]@i','@[ìíiiîïÎÏ]@i','@[úûùüÛÜ]@i','@[òóõôöÔÖ]@i','@[ñÑ]@i','@[ýÿÝ]@i','@[ç]@i','@[ ]@i','@[^a-zA-Z0-9_]@');	
 
 
 
	$replace = array ('e','a','i','u','o','n','y','c','_','');
 
 
 
	return preg_replace($search, $replace, $in);
 
 
 
}
 
 
 
//test: filter
 
 
 
print(filter("àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ_ hdfghgfhd#$    dfd f d f d f d f "));
 
 
albedo0, 24/06/2008 23:10:

J'ai un problème concernant ce script…

En effet, les caractères sont repérés, mais sont tout simplement supprimés alors qu'ils devraient être remplacés…

Une idée ??

(Je précise l'enodage : ISO-8859-1)

Merci d'avance

 
hakazizi, 16/07/2008 11:33:

desoler masi rien ne fonctionne la chaine de teste est renvoyer tel quel <?php $test=“sam trop trop? ! ; .%µ * $'”; $test.='”<br>'; echo $test; function filter($test) {

$search = array ('@[éèêëÊË]@i','@[àâäÂÄ]@i','@[îïÎÏ]@i','@[ûùüÛÜ]@i','@[ôöÔÖ]@i','@[ç]@i','@[ ]@i','@[^a-zA-Z0-9_]@');
$replace = array ('e','a','i','u','o','c','_','');
return preg_replace($search, $replace, $test);

} echo $test; ?>

 
Lazarus, 24/07/2008 11:55:

Ouai bon ça reste de la base,

J'ai un problème peut-être plus intéressant :

REMPLACER LE \

J'ai par exemple un titre : L'école en été

Je vais créer mon html à la volée ainsi qu'un bandeau image avec écriture du titre dessus,

si le titre est juste “école en été” ma page va s'appller ecole_en_ete.html et le titre va s'inscrire en majuscule sur le bandeau “ECOLE EN ETE”

PAR CONTRE si le titre est bien “L'école en été” plus rien ne va :

la page va s'appeller “L\_ecole_en_ete.html” et le titre sur l'image “L\'ECOLE EN ETE”

Quelqu'un a une solution ?

 
Lazarus, 24/07/2008 13:11:

OUAI bon vu les motivés…. Il suffit si un \ vient s'interposer (normal quand un ' est dans les parages) il vous suffit ,après avoir supprimé les caractères spéciaux et mis en forme votre texte, de faire un stripslashes tout simplement ! PFFFFFF

 
Si vous ne pouvez pas lire les lettres, tlchargez ce fichier WEV et coutez les.