Emploi de strstr + else

  • Auteur de la discussion Auteur de la discussion dudo
  • Date de début Date de début
WRInaute impliqué
Bonjour,

j'ai une petite question sur l'emploi de strstr,
je ne comprends pas pourquoi mon écriture ligne 2
ne fonctionne pas alors que c'est parfait en ligne 1 ?

Code:
/1/ OK
if($productUrl[5] == strstr($productUrl[5],'18975')) { $note="(vert)";} 
else { $note="(rouge)";} 

/2/ Ne fonctionne pas
if($productUrl[5] == strstr($productUrl[5],'18975')) { $note="(vert)";} 
elseif ($productUrl[5] == strstr($productUrl[5],'99079')) { $note="(rouge)";} 
else { $note="";}
merci ludo
 
WRInaute impliqué
Dépend ce que tu entends par "ne marche pas".

Je ne comprends pas du tout ton code surtout, je ne vois pas de condition dans laquelle
Code:
$productUrl[5] == strstr($productUrl[5],'18975')
peut être vraie en dehors de
Code:
$productUrl[5] == '18975'

Si tu pouvais dire ce que tu cherches à faire :)
 
WRInaute impliqué
Dr DLP a dit:
Dépend ce que tu entends par "ne marche pas".

Je ne comprends pas du tout ton code surtout, je ne vois pas de condition dans laquelle
Code:
$productUrl[5] == strstr($productUrl[5],'18975')
peut être vraie en dehors de
Code:
$productUrl[5] == '18975'

Si tu pouvais dire ce que tu cherches à faire :)

Je vérifie la présence ou non de 18975 au sein de la chaine $productUrl[5] s'il le trouve
affichage de $note corespondant, et ainsi de suite s'il trouve le chiffre suivant affichage du note correspondant,
puis si il ne trouve rien on affiche une variable $note vide

et c'est tout,
 
WRInaute impliqué
Un peu curieux comme DR DLP :)

@dudo d'après ton code là où tu mentionne OK,
$note ne prend que rouge !

il parait que $productUrl[5] est l'url d'un produit ! Une url ne peut jamais contenir uniquement "18975" !

Donc la condition d'égalité est toujours fausse :)
 
WRInaute impliqué
Désolé j'ai pas lu ta nouvelle réponse ! il faut que tu change ton code :)

Code:
if (preg_match("/18975/", $productUrl[5]){ $note="vert";} ...
 
WRInaute impliqué
Juste parce que j'aime être contrariant:
Code:
if (strpos($productUrl[5], '18975')){ $note="vert";}
sera plus rapide :mrgreen:

Ah oui, si tu analyses plusieurs résultats possibles, passe par un tableau pour éviter des conditions en boucle :)
 
WRInaute impliqué
bilos a dit:
Désolé j'ai pas lu ta nouvelle réponse ! il faut que tu change ton code :)

Code:
if (preg_match("/18975/", $productUrl[5]){ $note="vert";} ...

Merci !
bon, avec preg_match ce n'est pas pire, pas mieux c'est à dire ok avec

if (preg_match("18975", $productUrl[5])) { $note="(vert)";} else { $note="(rouge)";}

mais inoperant sur
if (preg_match("18975", $productUrl[5])) { $note="(vert)";} elseif (preg_match("99079", $productUrl[5])) { $note="(rouge)";}
{ $note="(Nuitée/par personne)";}
 
WRInaute impliqué
bilos a dit:
T'as raison Dr DLP :) Habitué par pregmatch pour plusieurs mots clés ... ;)


Voilou, donc juste pour info, ni preg_match ou strposs ne fonctionne ce qui est bizarre, y compris dans le
second cas que je vous précise, j'ai repris mon code et recherchez le début d'une url et c'est ok,

if($productUrl[5] == strstr($productUrl[5],'http://www.tintin.com')) { $note="(vert)";}
elseif($productUrl[5] == strstr($productUrl[5],'http://www.kiki.com')) { $note="(rouge)";}
 
WRInaute accro
Ton test ($toto == strstr($toto,'xxx')) n'est vrai que si $toto commence par xxx. Je ne pense pas du tout que ce soit ce que tu veux. Utilise effectivement strpos ou preg_match comme suggéré. Si ça ne fonctionne pas, c'est probablement que les variables que tu testes ne contiennent pas ce que tu penses.

Jacques.
 
WRInaute impliqué
jcaron a dit:
Ton test ($toto == strstr($toto,'xxx')) n'est vrai que si $toto commence par xxx. Je ne pense pas du tout que ce soit ce que tu veux. Utilise effectivement strpos ou preg_match comme suggéré. Si ça ne fonctionne pas, c'est probablement que les variables que tu testes ne contiennent pas ce que tu penses.

Jacques.

Je ne conteste pas l'utilisation de strpos ou preg_match comme suggéré, je dis que le 1er code
est viable dans ce cadre précis d'utilisation, que le contenu des variables est bien sûr vérifié et que je n'ai pas encore
trouvé pourquoi strpos ou preg_match ne fonctionne pas dans ce cadre, avec ci-dessous un code très proche
du code réel.

Code:
<?
$productUrl[5]='http://www.tintin.com/fr/coco';
if($productUrl[5] == strstr($productUrl[5],'http://www.tintin.com')) { $note="(vert)";} 
elseif($productUrl[5] == strstr($productUrl[5],'http://www.kiki.com')) { $note="(rouge)";}

echo $note;


if  (strpos($productUrl[5],'http://www.tintin.com')) { $note="(vert)";} 
elseif (strpos($productUrl[5],'http://www.kiki.com')) { $note="(rouge)";}

echo $note;

?>
 
WRInaute impliqué
De retour au hackaton :)

@dudo peux-tu nous envoyer le format de la chaine que $productUrl[5] est censé contenir !
et avant de poster ta réponse fais un print_r($productUrl[5]);

Dans la suite je vais supposer que $productUrl[5] est de la forme : "ht*tp://tonsite.com/tapage-1555.html "
Voilà ce que tu dois faire :

Code:
preg_match('/([0-9]+)\.html/', $productUrl, $val);
$n = $val[1];

switch ($n) {
    case "18975":
        $note = "vert";
        break;
    case "99079":
        $note = "rouge";
        break;
    default:
       $note = "(Nuitée/par personne)";
}

Sinon si tes adresses ne contiennent qu'un seul numéro tu peux simplement remplacer le Regex par :

Code:
preg_match('{(\d+)}', $productUrl, $val);
 
WRInaute accro
Ton test avec strpos ne fonctionne pas parce que la chaîne que tu cherches est au début de la chaîne que tu examines, donc strpos renvoie 0. Il faut donc utiliser === false pour tester si ça n'y est pas (ou === 0 pour vérifier que la chaîne recherchée est bien au début).

Perso, j'utiliserais un preg_match ancré (avec un ^ au début de la regex). Evidemment il faut faire attention à escaper les caractères spéciaux (en particulier le . et éventuellement le / si tu l'utilises comme délimiteur).

Jacques.
 
Nouveau WRInaute
C'est réécrit avec Apache ? pourquoi ne pas tout simplement faire un $_GET['productId'] ? ou bien si réécriture utiliser un séparateur type '-' ou ',' dans l'url, et prendre la fin de la chaîne comme identifiant numérique du produit ?

parce que là ça a l'air un peu aléatoire comme résultat...
 
WRInaute impliqué
@titan
On lui a proposé la meilleure solution indéppendamment du format de l'url ;)

ça lui permet d'extraire le contenu de l'url et éviter les conditions successives...

$productUrl[5] est issu d'un tabeau, je ne pense pas que ça provient d'un formulaire !

Moi je m'arrête là parce que j'ai testé le code que j'ai soumis :)

à bientôt
 
Nouveau WRInaute
Je suis bien d'accord que tu as répondu au problème exposé Bilos, c'est juste que j'ai l'impression que le problème survient en raison d'une architecture ou design pattern inutilement compliqué par rapport au résultat attendu...

Si $productUrl ne provient pas d'une url, c'est encore pire : je ne vois pas pourquoi enregistrer une donnée non traitée en base, et effectuer une recherche par expression régulière à chaque fois qu'on la ressort de la base pour afficher un simple style...

Bref peut-être serait-il plus productif que Dudo explique ce qu'il cherche à faire exactement :)
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut