Cela se produit car vous utilisez strpos
sur le htmlspecialchars($str)
mais vous utilisez substr
sur $str
.
htmlspecialchars()
convertit les caractères spéciaux en entités HTML. Prenez un petit exemple:
// search 'foo' in '&foobar'
$str = "&foobar";
$toFind = "foo";
// htmlspecialchars($str) gives you "&foobar"
// as & is replaced by &. strpos returns 5
$pos = strpos(htmlspecialchars($str),$toFind);
// now your try and extract 3 char starting at index 5!!! in the original
// string even though its 'foo' starts at index 1.
echo substr($str,$pos,strlen($toFind)); // prints ar
Pour résoudre ce problème utilisent le même botte de foin dans les deux fonctions.
Pour vous répondre à l'autre question de trouver toutes les occurrences d'une chaîne dans l'autre, vous pouvez utiliser le 3ème argument de strpos
, offset, qui spécifie où chercher. Exemple:
$str = "&foobar&foobaz";
$toFind = "foo";
$start = 0;
while($pos = strpos(($str),$toFind,$start) !== false) {
echo 'Found '.$toFind.' at position '.$pos."\n";
$start = $pos+1; // start searching from next position.
}
sortie:
Trouvé foo en position 1
Trouvé foo à la position 8
Je ne sais pas ce que vous voulez exactement avec ce code, mais il ne me semble pas clair quelle variable vous souhaitez obtenir avec. A ce moment, vous êtes censé faire écho exactement le contenu de $ toFind, alors pourquoi ne pas echo $ toFind quand une correspondance est trouvée? Ou est-ce que vous avez trop d'importance? Le problème semble toutefois provenir de la fonction htmlspecialchars(), qui peut augmenter la longueur et la disposition de la chaîne d'origine. Si vous souhaitez afficher le texte correspondant, assurez-vous de l'utiliser sur la ligne de sous-traitance. –
@Pelle ten Cate: comme vous pouvez le voir, la réponse envoyée par codaddict était la même que la vôtre.Et je ne veux pas juste echo $ toFind, parce que je vais utiliser la position trouvée pour obtenir du contenu après celui que je trouve. – sikas