Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/02/2011, 19h30   #1
Invité de passage
 
Inscription : septembre 2008
Messages : 19
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 19
Points : 1
Points : 1
Par défaut Atomes ANDed ?

Bonjour à tous,

j'utilise Zend_Filter_PregReplace pour renommer un nom de fichier et notamment supprimer tous les caractères qui ne sont pas des lettres, des chiffres ou des espaces.

La première version de ma regexp est évidemment fausse :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
if (Zend_Filter_PregReplace::isUnicodeSupportEnabled()) {
    		$notAllowedCharsMatch = '#[\P{Separator}\P{Letter}\P{Number}]+#';
    		/**
    		 * The spaces characters are stripped out and replaced by a single space character
    		 */
    		$spaceCharsMatch = '#\P{Separator}+#';
} else {
    		$notAllowedCharsMatch = '#[^A-Za-z0-9[:spaces:]]+#';	
    		$spaceCharsMatch = '#[[:spaces:]]+#';
}
Code :
1
2
3
4
5
6
7
8
9
10
11
 
$defaultInflector->setFilterRule(
    		'basename', 
    		array(
    			new Zend_Filter_PregReplace(array('match' => $notAllowedCharsMatch, 'replace' => '')),
    			new Zend_Filter_PregReplace(array('match' => $spaceCharsMatch, 'replace' => ' ')),
    			new Zend_Filter_StringToLower(),
			new Zend_Filter_Word_SeparatorToDash(' '),
			$iconvFilter
    		)
);
Évidemment les caractères à conserver sont effacés dû au fait qu'une lettre correspond au pattern "n'est pas une espace" ou "n'est pas un chiffre".

Ma question est donc la suivante : Comment exprimer le pattern suivant :

ni une lettre ni une espace ni un chiffre.

Ou comment joindre les atomes de mon pattern par un AND ?

Merci beaucoup par avance !

Frédéric
fhebert est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 20h52   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Ton expression est bonne (a part que c'est :space: ).
Le ^ c'est "sauf tous les éléments"

Plus simplement même :
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 22h01   #3
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
les noms complets pour masque utf-8 PERL ne sont pas compatible PCRE

c'est
\P{Separator}\P{Letter}\P{Number}

\P{Z}\P{L}\P{N}
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 13h11   #4
Invité de passage
 
Inscription : septembre 2008
Messages : 19
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 19
Points : 1
Points : 1
Par défaut Re: Atomes ANDed

Merci pour vos réponses !

Effectivement le masque est correct. Quand l'unicode est "désactivé" ( le masque #[^A-Za-z0-9[:space:]]+# est donc utilisé) le preg_replace fonctionne (après modification de la classe [:spaces:] en [:space:]).

Par contre la regex unicode ne semble pas fonctionner même avec le masque donné par stealth35.

Tous les caractères qui devraient être conservés sont retirés, par exemple : "Test" devient une chaîne vide.

Le pattern que j'ai défini en fin de compte, utilisant les propriétés Unicode :

Une idée ?

Frédéric
fhebert est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 13h31   #5
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
fais plutôt l'inverse :
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 14h34   #6
Invité de passage
 
Inscription : septembre 2008
Messages : 19
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 19
Points : 1
Points : 1
Par défaut Re: Atomes ANDed

Oui effectivement cela fonctionne mieux même si je ne comprends pas trop pourquoi.

Les expressions sont pourtant équivalentes, non ?

Merci beaucoup pour ton aide rapide et efficace !

Frédéric
fhebert est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h42.


 
 
 
 
Partenaires

Hébergement Web