[PHP] Condition boucle while ? [Résolu/Fermé]

Signaler
Messages postés
1192
Date d'inscription
vendredi 7 septembre 2007
Statut
Membre
Dernière intervention
17 mars 2013
-
KunGu
Messages postés
1192
Date d'inscription
vendredi 7 septembre 2007
Statut
Membre
Dernière intervention
17 mars 2013
-
Bonjour,


J'ai fais un petit bout de code qui doit m'afficher chaque lien complet tel que ce lien : https://www.google.fr/search?q=abc&gws_rd=ssl avec donc 35 caractères.

J'ai fait une boucle qui va rechercher dans $URLbordel ces URLs qui sont, par définition, en bordel :)
Ensuite donc je vais récupérer les URLs sur une page avec a chaque fois un retour chariot (le but étant après d'envoyer chaque URL vers une fonction)

Seulement, le script met genre 6-7 secondes à s'éxécuter, et en mettant un echo après la boucle je me suis aperçu que je ne voyais jamais l'écho. J'en conclus que le progromma n'arrive pas à sortir de la boucle ??

Ma condition du while est-elle correcte pour sortir de la boucle une fois toutes les URLSbordel analysée ?

Merci bien les amis ! :)




	$URLbordel = $_POST['urls'];
	
	$atester3 = 'http://www.google.fr/search?q=';
	$offset = 0;
	$test3 = 1;
	
		while (is_integer($test3))
		{
			$test3 = stripos($URLbordel, $atester3, $offset); //Vérification présence atester3
			echo $test3;
			if ($test3 === false && $offset === 0)
			{
				echo("ERREUR");
				exit();
			}
			elseif ($test3 === false && $offset !== 0)
			{
				exit();
			}
			else
			{
				$resultat = substr($URLbordel, $test3, 35);
				$affichage = MorphURL("$resultat");
echo "$resultat <br />";

				
			}
			$offset = $test3 + 35; //Ajout de 35 : lien "https://www.google.fr/search?q=abc&gws_rd=ssl"
		}






5 réponses

Messages postés
6709
Date d'inscription
mercredi 13 avril 2011
Statut
Membre
Dernière intervention
28 septembre 2015
1 236
Bonjour,

Pourquoi toujours des while et des for pour vos boucles sur un array???

Il y a une fonction qu'elle est très bien: foreach

foreach($_POST AS $key => $val) {
$test3 = stripos($val, $atester3, $offset); //Vérification présence atester3
echo $test3;
// ....ici le reste de votre traitement...
}


Et là aucune prise de tête pour savoir comment la boucle s'achève. S'il y a 1 élément dans $_POST, la boucle s'exécute 1x, s'il y en a 500, la boucle tournera 500x...

A+
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 71105 internautes nous ont dit merci ce mois-ci

Messages postés
3077
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
19 juin 2013
119
Salut !

Ouais je comprends un peu mal comment ton script tourne, mais une chose de sûre : ta boucle est sensée se répéter tant que $test3 est un nombre. Il peut rester un nombre pendant longtemps !!! :-P

Si tu veux passer à travers les valeurs de ton $_POST['urls'] (j'assume que c'est un array ?) pourquoi ne pas utiliser un foreach() au lieu d'un while() ? Si c'est un string tu peux utiliser un petit explode() au préalable pour séparer ce string en array, ce qui sera plus facile à analyser.

Comme ca, je penser qu'il y a un point où tu demandes si une URL précise se trouve dans $_POST['urls'] ? Une fois que c'est un array, facile, tu fais une vérification in_array().

Dis-moi si ça t'aide !
Messages postés
1192
Date d'inscription
vendredi 7 septembre 2007
Statut
Membre
Dernière intervention
17 mars 2013
208
Alors non, le $_POST['urls'] n'est pas un array, il contient les données qui viennent d'être écrites dans un formulaire juste avant.
Mon but est de récupérer des URLs qui seront écrites dans le formulaire (le problème est que l'organisation dans le formulaire sera "en bordel" c'est à dire qu'il peut y avoir du texte entre ... etc ..) et d'ensuite les envoyer une par une à une fonction (que j'ai simplifié par un simple echo)

Le problème est que je veux arrêter ma boucle de tourner une fois que stripos est arrivé au bout de son analyse (qu'il n'y a plus d'occurences), mais je ne sait pas comment !

Ton idée d'explode est bonne, sauf que je n'ai aucun délimiteur étant donné que je ne connais pas l'organisation dans URLbordel ... A moins que je puisse utiliser explode au lieu de stripos ?
Je ne sais pas :(
coeus
Messages postés
3077
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
19 juin 2013
119
A moins que je puisse utiliser explode au lieu de stripos ?

C'est ce que je préconise. Peut-être que des délimiteurs, tu peux en insérer artificiellement. Là c'est un peu dur de te conseiller vu que je n'ai pas le code qui "forge" ton $_POST[urls] (qui doit être assez compliqué anyway)... Mais peut-être que tu peux ajouter un "#####" ou quelque chose dans le genre, au moment de passer tes données de formulaire dans le POST ?

Si je comprends bien, tu considères qu'il y a une nouvelle entrée dans ton URLS à tous les 35 caractères ? Dans ce cas, pour te simplifier la vie, peut-être que tu pourrais faire un chunk_split() au préalable sur ton $_POST[urls] ? Après c'est facile de tout rassembler ça dans un array bien classé.
Messages postés
641
Date d'inscription
mercredi 1 juillet 2009
Statut
Membre
Dernière intervention
10 août 2012
97
Bonjour,
as-tu chercher du cote de preg_split() ?

L'utilisation des regexp me semble etre indiquee dans ton cas et plus simple...
Messages postés
1192
Date d'inscription
vendredi 7 septembre 2007
Statut
Membre
Dernière intervention
17 mars 2013
208
Ahh mais en fait tu n'a pas totalement saisi le sens du code, je t'explique.

J'ai une page toute simple, avec un textarea et un bouton valider où les utilisateurs pourront coller des URLs (de la forme https://www.google.fr/search?q=abc&gws_rd=ssl donc de 35 caractères). Seulement, ils pourront les coller n'importe comment (exemple : https://www.google.fr/search?q=abcbonjour&gws_rd=ssl les amishttps://www.google.fr/search?q=abcles&gws_rd=ssl amis bonjour).
Mon script va donc récupérer dans ce formulaire qui vient d'être posté ces URLs "en bordel" et va donc rechercher la position des occurrences "https://www.google.fr/webhp?gws_rd=ssl" pour ensuite copier l'URL entière c'est à dire avec "abc" (ex donc : https://www.google.fr/search?q=abc&gws_rd=ssl

Ma boucle sert donc à répéter la recherche dans tout le document à la recherche d'autres occurrences. Seulement, je veux qu'elle s'arrête une fois qu'il n'y a plus d'occurrences disponibles dans la variable (ce que j'avais fait au début avec is_integer mais qui ne fonctionne pas)

Ce qu'il me faudrait savoir en fait, c'est ce que renvoie la fonction stripos une fois que la recherche est finie pour arreter ma boucle ...


Si je comprends bien, tu considères qu'il y a une nouvelle entrée dans ton URLS à tous les 35 caractères ? Dans ce cas, pour te simplifier la vie, peut-être que tu pourrais faire un chunk_split() au préalable sur ton $_POST[urls] ? Après c'est facile de tout rassembler ça dans un array bien classé.


Non non ! C'est que je sais que l'URL que je veux trouver fait 35 caractères, donc dès qu'il m'a trouvé une position d'occurrence, je copie à partir de cette position les 35 caractères suivants dans une variable (ce qui est UNE url), puis je continue ma recherche avec un l'offset de la position + 35 caractères.


Désolé si je te fais un peu t'embrouiller par ce code ^^
Et merci de m'aider c'est sympa :D
coeus
Messages postés
3077
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
19 juin 2013
119
Ah d'accord je comprends un peu mieux.
Dans ce cas, la solution la plus facile d'après moi, ce serait une expression régulière.

Utilise la fonction preg_match pour comparer ton string avec la formule suivante :

'/^(http:\/\/www.google.fr\/search?q=)(.+(?=http|###))/e'

Note, je n'ai pas testé cette expression, il y aura probablement des détails à régler... Tu peux t'aider de cette référence pour mieux comprendre. En gros, ce que j'essaie de faire, c'est trouver un string dans ton POST[urls] qui :
- commence par l'adresse de google (de là le "^" en début de chaîne) ; et
- est suivi d'un ou plusieurs caractères (d'où le ".+") mais seulement si ces caractères sont suivis par le string "http" OU par le string "###" (que tu peux rajouter artificiellement pour dénoter la fin du POST[urls], parce que sinon, la dernière adresse de la liste ne paraîtra pas ;
- je fais la recherche dans tout le string (avec le "e" en fin de chaîne)

Si tu utilises bien le preg_match, tu devrais te retrouver avec un array contenant toutes les instances où l'expression a été reconnue dans ton POST[urls]... Après, ce sera plus facile à traiter.

Pour plus de sûreté, tu peux donner un autre/d'autres délimiteur(s) que seulement "http" ; tu peux mettre "http:\/\/www.google.fr\/" ou n'importe quoi d'autre qui risque de marquer le début d'une nouvelle URL. Fais seulement attention à bien escaper tes caractères spéciaux.

Voilà, c'est un peu le bordel, je sais, les expressions régulières sont difficiles à expliquer, il va falloir que tu l'expérimentes, si tu n'es pas déjà habitué(e). N'hésite pas s'il y a un détail que tu ne comprends pas, ou poste-moi les résultats des expressions que tu testes et qui ne fonctionnent pas, je pourrai t'aider à trouver ce qui manque...

En espérant que ça t'aide...
KunGu
Messages postés
1192
Date d'inscription
vendredi 7 septembre 2007
Statut
Membre
Dernière intervention
17 mars 2013
208
Bon !
j'ai fini par utiliser une expression réguière, qui a trèèss bien marché, j'ai simplement utilisé "http:\/\/www.google.fr\/search\?q=..." comme expression régulière.
J'ai par contre utilisé preg_match_all comme fonction pour pouvoir faire ma recherche sur toute la variable jusqu'à la fin, qui m'a rentré tout ca dans un tableau a 2 dimensions, que j'ai réussi à faire traiter correctement.
Tout marche, merci encore !