Page 1 sur 1

count_chars : syntaxe

Posté : 08 déc. 2005, 21:06
par spirou
Bonsoir !!!

J'ai de nouveau un p'tit problème :mrgreen:

Je souhaite compter le nombre d'occurences d'un caractère dans une chaîne.
J'essaie avec la fonction count_chars, mais comme j'ai pas trouvé beaucoup d'exemple, je dois certainement faire une erreur de syntaxe.

Voici le code qui ne fonctionne pas :
if(count_chars($char, '.') != 3)
{
        ...........        
}
Même en mettant trois points dans ma chaîne, la condition est toujours fausse, si quelqu'un pourrait me dire la syntaxe à utiliser pour mon exemple.

Merci :D

Posté : 08 déc. 2005, 21:17
par Cyrano
Le second paramètre de count-chars que tu utilises est invalide. La doc t'aurait été utile sur ce détail.

Proposition de correction:
<?php
$data = "Deux D et un F.";
foreach (count_chars($data, 1) as $i => $val)
{
    if($chr($i) == ".")
    {
        echo "Il y avait ". $val ." occurrence(s) de \"". chr($i) ."\" dans la phrase.\n";
    }
}
?>

Posté : 08 déc. 2005, 21:32
par spirou
Merci, mais j'ai déjà été voir cette fonction sur php.net.

Si je poste, c'est que je ne comprends pas trop le code qui y est présenté :oops:

Quand il y a beaucoup de paramètres, j'ai beaucoup de mal à comprendre.

Je suis obligé d'utiliser foreach pour l'appliquer ?

Ensuite, à quoi correspond le 1 ?

En même temps, j'aurais aussi une autre question, il faudrait que je vérifie que le premier et dernier caractères ne sont pas des points, avec quelle fonction(s) je pourrais vérifier ceci ?

Posté : 08 déc. 2005, 21:42
par Cyrano
C'est le mode, paramètre facultatif expliqué dans la documentation:
...
1 - identique à 0 mais seules les fréquences supérieures à zéro sont listées.
...
Grosso-modo, ça va compter uniquement les caractères présents à au moins un exemplaire dans la chaine et passer les autres s'ils sont absent.

Posté : 08 déc. 2005, 21:55
par nicolas
En même temps, j'aurais aussi une autre question, il faudrait que je vérifie que le premier et dernier caractères ne sont pas des points, avec quelle fonction(s) je pourrais vérifier ceci ?
$chaîne[0] et $chaîne[strlen($chaîne)-1] sont respectivement le premier et le dernier caractère de la chaîne $chaîne.

Posté : 08 déc. 2005, 22:11
par Cyrano
À mon avis pour cette seconde partie, une expression régulière serait plus appropriée.
<?php
$masque = "#^[^\.].*[^\.]$#";
$chaine1 = "abcdefghi.";
$chaine2 = "abcdefghi";
if(preg_match($masque, $chaine1))
{
    echo("<p>La chaine numéro 1 est valide</p>");
}
else
{
    echo("<p>La chaine numéro 1 est invalide</p>");
}

if(preg_match($masque, $chaine2))
{
    echo("<p>La chaine numéro 2 est valide</p>");
}
else
{
    echo("<p>La chaine numéro 2 est invalide</p>");
}
?>
Essaye ceci, ça va te retourner:
La chaine numéro 1 est invalide

La chaine numéro 2 est valide

Posté : 08 déc. 2005, 22:55
par spirou
Merci beaucoup :D

Je l'intégrerais lorsque mon petit script fonctionnera, ce qui n'est pour l'instant pas le cas :?

Malgré le fait que ce que j'entre dans mon formulaire est valide, mon script reste bloqué à une condition.

Si vous voyez d'où cela pourrait venir.
Voici le début de mon script :
if(isset($_POST['ip']))
     {
        $ip = $_POST['ip'];
				foreach(count_chars($ip, 1) as $i => $val)		// ici on détermine combien de points sont présents dans la chaine
				{
				    if(chr($i) == ".")
				    {
				    		echo $val;		// ici : ok c'est bien 3
				    		if($val != 3)		// ici : ok
				    		{
										echo "<p id='result'>Rappel : Chaque octets d'une adresse IP est compris entre 0 et 255<br />
													Autre exemple : 86.200.25.125<br />";
								}
								else  // donc que $val == 3
								{
										$octets = explode('.', $ip);
						        if(!is_numeric($octets['0'] xor $octets['1'] xor $octets['2'] xor $octets['3']))		// le problème se situe ici
						        {
												echo "<p id='result'>Veuillez n'entrez que des chiffres de 0 à 9<br />";		//  blocage à ce niveau
												echo $octets['0']."/".$octets['1']."/".$octets['2']."/".$octets['3'];		// vérif : OK
										}
C'est la dernière condition qui bloque.

Posté : 08 déc. 2005, 22:58
par Cyrano
Les index étant des entiers, lève les apostrophes:
if(!is_numeric($octets[0] xor $octets[1] xor $octets[2] xor $octets[3]))

Posté : 08 déc. 2005, 23:09
par spirou
Toujours pareil :(

Je viens d'avoir l'idée de réduire les paramètres en mettant :
if(!is_numeric($octets[0]))
Et là mon programme fonctionne, et va jusqu'au bout.
je ne comprends pas :?

Est-ce que :
if(!is_numeric($octets[0] xor $octets[1] xor $octets[2] xor $octets[3]))
Est correct ?

Posté : 08 déc. 2005, 23:12
par Cyrano
Je suis pas certain, mais je n'ai jamais vu l'utilisation de "xor" en PHP, remplace par ||

Posté : 08 déc. 2005, 23:47
par spirou
J'ai essayé, toujours pas...

J'ai aussi essayé en remplaçant !is_numeric par !is_int, mais toujours pareil..

Je verrais demain car là, je ne vois pas trop.

Merci :wink:

Posté : 09 déc. 2005, 14:46
par spirou
Bon, j'ai trouvé comment faire :
if((is_numeric($octets[0])) == false || (is_numeric($octets[1]) == false) || (is_numeric($octets[2])) == false  || (is_numeric($octets[3])) == false)
Et comme ça, ça fonctionne :D