rechercher dans une chaine l'existance un passage...

Mammouth du PHP | 843 Messages

14 mai 2007, 10:11

salut à tous :)

j'ai regarder dans la doc pour les fonction travaillant sur les chaine et je ne trouver pas mieux que strpbrk() pour rechercher un passage de chaine... :?

mon objectif est de verifié dans une chaine si le passage The_passage existe mais le soucis c'est que strpbrk() me retourne la chaine rechercher + la suite alors que je prefererai un fonction qui me retourne un boléen si le passage rechercher existe dans la chaine soumise :-k

si quelqu'un a une idée à me soumettre ;)
merci d'avance
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Mammouth du PHP | 843 Messages

14 mai 2007, 10:34

ok j'ai trouvé un truc via la fonction strpos()...
$passage_detecte = (strpos("$page", 'Thepassage') != false) ? true : false;
que penser vous de cette methode?
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Eléphant du PHP | 259 Messages

14 mai 2007, 10:36

hello,

Si la chaine existe pas, strpbrk() retourne false... sinon une chaine (ce qui équivaudra a true), c'est pas suffisant ?

Mammouth du PHP | 843 Messages

14 mai 2007, 10:48

sinon je doit puvoir faire ainsi:
$passage_detecte = (strpos("$page", 'Thepassage') === false) ? false : true;
c'est mieux nan :-k
mon objectif est de retourner true ou false, mais il est vrai que si je verifie simplement si $passage_detecte != false, cela pourai suffir...

que penser vous de mon bout de code? cela fonctionnerai quand même...
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

ViPHP
ViPHP | 3607 Messages

14 mai 2007, 11:08

salut,
$passage_detecte = (bool)strpos($page, 'Thepassage');
et comme ça?

Mammouth du PHP | 843 Messages

14 mai 2007, 11:31

c'est plus light c'est sur :)

en plus j'adore decouvrir de nouvelle façon de coder les chose :D

adopter :wink:
Merci
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

14 mai 2007, 11:39

Oui, mais le problème c'est que
(bool) 0 === FALSE
Donc si la sous-chaîne est à la position 0 ben ça marche pas. Si vous tenez absolument à utiliser la manière la plus rapide, si mes souvenirs sont bons il s'agit de
$passage_detecte = is_int(strpos($page, 'Thepassage'));
Sachant que la différence avec === FALSE se compte en nanosecondes ;)

Mammouth du PHP | 843 Messages

14 mai 2007, 11:42

hmmmm très bonne remarque :-k
je vais essayer de suite pour voir et je revient vous dire.
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

ViPHP
ViPHP | 3607 Messages

14 mai 2007, 11:51

oups :oops: si en plus je dis des bétises....
Désolé :lol:

Mammouth du PHP | 843 Messages

14 mai 2007, 11:57

ok cela fonction bien, ne tient pas compte de la position du debut de passage, et c'est tres light. :)

un must :wink:
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

14 mai 2007, 11:59

J'en profite pour balancer un benchmark rapide qui, au passage, corrige ce que je pensais plus haut.

Si
$haystack = 'Lorem ipsum dolor sit amet';
$needle = 'ipsum';
J'obtiens pour 100 000 itérations

Code : Tout sélectionner

0.0935 $found = (strpos($haystack, $needle) !== false); 0.0952 $found = !(strpos($haystack, $needle) === false); 0.0993 $found = (strpos($haystack, $needle) === false) ? false : true; 0.1025 $found = (strpos($haystack, $needle) !== false) ? true : false; 0.1432 $found = is_int(strpos($haystack, $needle));
Les chiffres changent très légèrement et à peu près dans les même proportions selon que $needle se trouve en début de chaîne, en milieu de chaîne ou pas dans la chaîne.

Mammouth du PHP | 505 Messages

14 mai 2007, 18:20

En fait, il faut utiliser strpos, et la comparaison avec === (3 égals)
de cette facon, si cela retourne false ou 0 tu fera la différence car === compare la valeur ET le type.
if(strpos($string,$needle) === false) {
 echo 'not found ';
}
Pas la peine d'utiliser de conversion en booléen ou en entier, c'est totalement superflu. Les opérateurs === et !== sont concu pourt traiter ce genre de cas.
0 == false retourne vrai
0 === false retourne faux

Donc meme si tu trouves la chaine au début, cela fonctionne

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

14 mai 2007, 20:09

Pas la peine d'utiliser de conversion en booléen ou en entier, c'est totalement superflu
Sauf quand t'as des raisons de le faire. J'avais des benchmarks sur une ancienne version de PHP (5.1.x si mes souvenirs sont bons) où is_int(strpos()) donnait de bien meilleurs résultats que les comparateurs stricts === et !== (en fait c'était un petit peu plus compliqué et dépendait de la probabilité de trouver la sous-chaîne). Il semblerait néanmoins que la tendance ce soit inversée en 5.2 (sauf erreur de manip de ma part).

Mammouth du PHP | 505 Messages

14 mai 2007, 22:11

sur une ancienne version de PHP (5.1.x si mes souvenirs sont bons) où is_int(strpos()) donnait de bien meilleurs résultats que les comparateurs stricts === et !== (en fait c'était un petit peu plus compliqué et dépendait de la probabilité de trouver la sous-chaîne).
Bref, dans certain cas de figure avec certaine version, il y a peut etre des pouillèmes a récupérer, mais au final, la bonne méthode reste quand meme l'utilisation des comparateurs stricts.

Quand tu en es a bencher sur ce genre de truc, c'est (a mon avis) qu'il y a peut etre un problème plus global a envisager... type Pb de conception... Et la solution pour avoir un vrai gain se trouve plutot dans l'utilisation d'un ou plusieurs systèmes de cache, type op code, de page ou partiel, de fonction ou de bdd. Je m'occupe d'un site dont la charge est très fluctuante, relativement tranquille en nominal de (env 4 a 5M de pages/jours) et relativement forte lors d'évènement (1M de page/heure), et donc l'infrastructure matériel est plutot modeste (4 serveurs) et permet néanmoins de tenir sans problème les charge évènementielles qui peuvent durée plusieurs heures. Mais je n'ai jamais bencher ce genre de truc, en revanche, j'ai beaucoup travailler sur les systèmes de caches a plusieurs niveau ainsi que le le fonctionnement des caches des browsers qui va du tout au tout d'un browser à l'autre (et je ne parle meme pas des bugs de certains navigateurs sur la gestion du cache telque IE pour qui il faut bien trouvér des solutions puisque il reste largement majoritaire )

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

14 mai 2007, 23:41

Comme je le disais plus haut il s'agit d'un gain en nanoseconds, ce qui, il y a quelques années, ne suffisait même pas à faire un accès mémoire donc effectivement c'est plutôt réservé aux boucles qui s'éternisent.