Page 1 sur 1

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

Posté : 14 mai 2007, 10:11
par BeRoots
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

Posté : 14 mai 2007, 10:34
par BeRoots
ok j'ai trouvé un truc via la fonction strpos()...
$passage_detecte = (strpos("$page", 'Thepassage') != false) ? true : false;
que penser vous de cette methode?

Posté : 14 mai 2007, 10:36
par Jules Petibidon
hello,

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

Posté : 14 mai 2007, 10:48
par BeRoots
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...

Posté : 14 mai 2007, 11:08
par jojolapine
salut,
$passage_detecte = (bool)strpos($page, 'Thepassage');
et comme ça?

Posté : 14 mai 2007, 11:31
par BeRoots
c'est plus light c'est sur :)

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

adopter :wink:
Merci

Posté : 14 mai 2007, 11:39
par Hubert Roksor
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 ;)

Posté : 14 mai 2007, 11:42
par BeRoots
hmmmm très bonne remarque :-k
je vais essayer de suite pour voir et je revient vous dire.

Posté : 14 mai 2007, 11:51
par jojolapine
oups :oops: si en plus je dis des bétises....
Désolé :lol:

Posté : 14 mai 2007, 11:57
par BeRoots
ok cela fonction bien, ne tient pas compte de la position du debut de passage, et c'est tres light. :)

un must :wink:

Posté : 14 mai 2007, 11:59
par Hubert Roksor
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.

Posté : 14 mai 2007, 18:20
par titerm
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

Posté : 14 mai 2007, 20:09
par Hubert Roksor
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).

Posté : 14 mai 2007, 22:11
par titerm
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 )

Posté : 14 mai 2007, 23:41
par Hubert Roksor
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.