la fonction strpos();

WRInaute occasionnel
Bonjour,
J'essaye d'attribuer un identifiant à la volée pour un xcertains nombre d'articles que je désire répertorier sur mon site.
En gros j'ai un array listant les termes avec l'identifiant correspondant :
Code:
$companies=array('entrep' => '4','entrep2' => '5','entrep3' => '6','entrep4' => '7','entrep5' => '8',) ;

et une fonction qui me permet de mettre directement un identifiant (ici $section) sur un titre extrait de ma base :
Code:
while ($title=mysql_fetch_array($sql)) 

{ 

$mytitle= $title['title'];
$i=0;
foreach($companies as $nom=>$section)
    {
   
$pos= strpos($mytitle,$nom);
if($pos === false) 
   {

	}

else {
$i++;

echo $section ;

if ($i==1)
exit;

} // end of else 
   
   
   
   
    } //end foreach
	
	

} //end of while
Je voudrais savoir comment faire pour que ma fonction strpos () puisse repérer aussi bien les termes Entr1 que entr1 ou ENTR1, ne pas tenir compte de la casse en repérant le terme exact.
J'ai essayé de tout mettre en minuscule mais des fois dans mon titre j'ai des mots comme "entreprise" où il y a les lettres "entr" mais qui ne correspondent pas au nom propre d'une entreprise.
J'espère que je ne suis pas trop confu dans mes explications
Merci !
 
WRInaute accro
Alors tu vas sur la page de la doc de strpos http://php.net/manual/en/function.strpos.php et tu regardes dans la section "see also", et tu découvres stripos. Pfiou, c'était dur. Evidemment tu aurais aussi pu faire un strpos(strtolower($mytitle),$nom).

Sinon tu as la possibilité d'utiliser preg_match, qui te permet par exemple d'utiliser \b pour chercher "des mots entiers"...

Jacques.
 
WRInaute occasionnel
Merci pour ta réponse, je vais tester preg_match qui m'a l'air plus appropriée, car des fois mes noms sont composés de deux mots, j'ai cru comprendre que strpos(); eteait utilisée pour un seul mot...
 
WRInaute accro
Strpos recherche très "bêtement" la chaîne exacte que tu lui demandes de chercher. Donc si tu lui dis de chercher "te", il le trouvera dans "je te vois", dans "je termine", dans "ça en jette" ou encore dans "utilisateur".

Avec preg_match, tu peux lui dire de chercher "\bte\b", auquel cas il te trouvera que le premier "te" dans les exemples ci-dessus (et par rapport à un strpos qui rechercherait " te " avec des espaces avant et après, ça a l'avantage que ça marcherait aussi si "te" est le premier ou dernier mot, ou suivi ou précédé d'un symbole de ponctuation par exemple).

Tu peux aussi dans certains cas faire des expressions régulières plus complexes. Par exemple si tu cherches "Bison futé", mais que tu ne sais pas si les gens ne vont pas écrire ça "Bison-futé" ou "Bisonfuté", tu peux chercher "\bBison\W*futé\b" (\W est n'importe quel caractère qui n'est pas une lettre, et * signifie 0 ou plusieurs fois). Et évidemment en mettant les bonnes options tu peux gérer les minuscules/majuscules.

Si tu veux gérer les accents, dans le cas présent tu pourrais chercher "\bBison\W*fut[eé]\b". Je ne sais pas si en PHP on peut s'amuser avec les formes Unicode décomposées et les modificateurs (en perl on ferait un NFD sur la chaîne pour décomposer les caractères accentués en accents + caractère non accentué, puis on utiliserait \pM pour virer les accents).

[... oqp vérifier ...]

Ah ben alors c'est normalizer_normalize($string, Normalizer::FORM_D), on en apprend tous les jours :)

Jacques.
 
WRInaute occasionnel
Encore Merci pour ce tuto très instructif !
Cela me conforte dans mon choix de la fonction à utiliser...preg_match car mes noms peuvent contenir des Majuscules/minuscule dans la phrase...
hanlin
 
Discussions similaires
Haut