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.
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); }
La variable $search est un tableau qui correspond à des expressions régulières.
$replace est la correspondance…
Par exemple :
[éèêëÊË] sera remplacé par “e”
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
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
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
Nickel ton script !! un grand merci
MERCI !
vraiment bien ce pti bout de code ;) par contre si je mets en '-' a la place du underscore ca ne marche pas pourquoi ?
Si c'est dans l'expression régulière, il faut échapper le - avec \ comme ceci : \-
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 :)
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.
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
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…
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','_');}
dernière version
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
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; ?>
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 ?
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
Euh désolé, je sais que ça fait un baille ce tuto, mais comment faire pour qu'il ne supprime pas le caractère ”.” ?
Remplace ce bout '@[^a-zA-Z0-9_]@'); par '@[^a-zA-Z0-9_.]@'); en gros cela veut dire “remplace tout caractère sauf ceux-là”
Ca peut aider pour ceux qui comme moi, ont des lettres doublés avec un 'e' exple: ï → ei, à → ea Voilà le code :
Ca peut aider pour ceux qui comme moi, ont des lettres doublés avec un 'e' exple: ï → ei, à → ea Voilà le code :
function filter($in) {
// $search = array ('/[éèêëÊË]/','@[áãàâäÂÄ]@i','@[ìíiiîïÎÏ]@i','@[úûùüÛÜ]@i','@[òóõôöÔÖ]@i','@[ñÑ]@i','@[ýÿÝ]@i','@[ç]@i','@[ ]@i','@[^a-zA-Z0-9_]@');
$search = array ('@(é|è|ê|ë|Ê|Ë)@','@(á|ã|à|â|ä|Â|Ä)@i','@(ì|í|i|i|î|ï|Î|Ï)@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);}
merci
Une version améliorée:
function basic_string($str)
{ $entree = array('#[áàâäã]#','#[ÁÀÂÄÃ]#','#[éèêë]#','#[ÉÈÊË]#','#[íìîï]#','#[ÍÌÎÏ]#','#[óòôöõ]#','#[ÓÒÔÖÕ]#','#[úùûü]#','#[ÚÙÛÜ]#','#ÿ#','#Ÿ#','#ç#','#Ç#','# #','#[^a-zA-Z0-9_-]#'); $sortie = array('a','A','e','E','i','I','o','O','u','U','y','Y','c','C','_',''); return preg_replace($entree,$sortie,$str); }Super script ! Merci.