IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Atomes ANDed ?


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 19
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Ton expression est bonne (a part que c'est :space: ).
    Le ^ c'est "sauf tous les éléments"

    Plus simplement même :
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    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}

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 19
    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

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    fais plutôt l'inverse :

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 19
    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

Discussions similaires

  1. Drag and drop "de l'extérieur"
    Par Invité dans le forum C++Builder
    Réponses: 12
    Dernier message: 31/03/2020, 11h10
  2. [Look and feel] Texte des JLabels en gras
    Par aliasjcdenton dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 26/01/2006, 12h49
  3. mise en page (Header and Footer) en XML-XSL.
    Par christine dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 01/03/2004, 17h31
  4. Fip, modbus and co...
    Par xave dans le forum Développement
    Réponses: 2
    Dernier message: 24/05/2002, 14h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo