Vérifier qu'une chaine de caractère ne commence pas par

Mammouth du PHP | 536 Messages

09 nov. 2007, 10:50

Bonjour tout le monde, je sais c'est nul de vous embêter alors que c'est bientôt le weekend...

Je voulais savoir comment faire pour vérifier qu'une chaine de caractère ne commence pas par un ou plusieurs espaces.

En efffet, je travail avec des ficheirs xml et php4, mon fichier est indenté et lorsque je récupère le contenu de mes noeuds, il considère l'indentation comme des caractères. Je voudrais éviter ceci. POur cela, je pensais vérifier que le contenu de mon noeud ne commençait pas par un ou plusieurs espaces.
De ce fait, j'ai fait ainsi
if ( ereg("[^ +]", $value->get_content() ) )
{
//traitement
}
mais ça ne amrche pas, il ne vérifie pas que mon contenu contient ou pas des espaces au début de la chaine

Pouvez-vous m'aider ?
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

09 nov. 2007, 11:11

Le caractère ^ a deux fonctions, l'interdiction (que tu utilises) mais aussi spécifié que le pattern correspond bien au début de la chaine (que tu n'utilises pas :))

Sinon juste une idée simple comme ça, si tu sais tester qu'une chaine commence par un espace, alors tu peux facilement vérifier que ce test est faux ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 536 Messages

09 nov. 2007, 11:16

:wink: effectivement avec un ! devant, c'est mieux...

alors ici ma fonction ereg spécifiait quoi et vérifiait quoi ?

mais non car ici, je veux vérifier que ma chaine ne contient pas que 1 ou plusieurs espaces. Car je me suis rendu compte que si elle commence par un espace mais contient du texte après, elle n'est pas considérée. Comment faire alors pour palier à ceci ?
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

09 nov. 2007, 11:25

Les crochets définissent une classe, le ^ à l'intérieur d'une classe est une négation de ce qui suit. Tu interdisais donc la présence d'un ou plusieurs espace à l'intérieur de ta chaine, que ce soit au début, à la fin ou au milieu de celle-ci :)

Pour rester dans ton masque, ceci devrait fonctionner également :
ereg("^[^ +]", $value->get_content() )
Maintenant, on va à mon avis beaucoup plus vite pour comprendre ce qui est fait lorsque c'est écrit ainsi ;) :
!ereg("^ ", $value->get_content() )
Quoi qu'il en soit, un p'tit commentaire à côté pour expliquer le test ne coute rien et fait gagner bien plus de temps encore :)

Edit : Oops, au temps pour moi, j'avions pas bien compris la question... le plus simple pour vérifier que ta chaine ne contient pas que des espaces dans ce cas est sans doute de faire un trim() et de vérifier que le résultat n'est pas vide :)
Mais tu peux également définir un masque qui commence (^) par un ou plusieurs espaces ([ +]) et qui va jusqu'à la fin de la chaine ($) :)
Modifié en dernier par Ryle le 09 nov. 2007, 11:28, modifié 2 fois.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 536 Messages

09 nov. 2007, 11:27

Tu interdisais donc la présence d'un ou plusieurs espace à l'intérieur de ta chaine, que ce soit au début, à la fin ou au milieu de celle-ci :)
C'est bien ce que je voulais faire pourtant le traitement à l'intérieur de ma condition if était considéré. Pourquoi ?
Mais ce que je voudrais faire c'est interdire qu'un contenu ne soit que des espaces. Tu vois ?
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

09 nov. 2007, 11:28

Réponse croisée, j'ai édité mon message précédent ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 536 Messages

09 nov. 2007, 11:39

Donc en faisant comme ça :
if( ereg("^[ +]$", $value->get_content() ) ) //on vérifie que le contenu du noeud ne soit pas que des espaces et ne correspondent alors pas à une indentation
            {
logiquement j'emp^che d'entrer dans la boucle si le contenu de mon noeud est qu'une chaine d'espaces et rien d'autre.

Je ne pense pas que la fonction trim() soit appropriée ici pour ce que je veux faire.
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

09 nov. 2007, 11:52

Il te manque la négation, mais c'est ça :)

En revanche, d'après ton commentaire et la référence à l'indentation, on peut supposer que ta chaine puisse être composée non pas d'espace mais de tabulation.. il serait donc peut être plus simple de contrôle la classe [:blank:] qui regroupe espace et tabulation :

Code : Tout sélectionner

"^[:blank:]+$"
au cas où... http://www.phpfrance.com/tutoriaux/inde ... regulieres
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 536 Messages

09 nov. 2007, 11:56

ok merci pour l'aide. Maintenant, je vais m'occuper de supprimer les esapces avant une chaine de caractère. Je vais me servir de tout ce qu'on a dit avec ereg() et trim()
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!