Erreur : Warning: strpos() [function.strpos]: Offset n'est pas contenue dans la chaîne ne peut pas trouver de solution
Je sais, cette question a été posée, mais malheureusement, il n'existe pas de réponses sur la façon de résoudre ce problème.
Cela apparaît dans mes fichiers de log:
PHP message: PHP Warning: strpos(): Décalage qui n'est pas contenue dans la chaîne dans une ... sur la ligne 479
Malheureusement, je ne peux pas comprendre quelles sont les causes de ce problème et comment le résoudre. J'ai testé cette fonction plusieurs fois (avec de gros $texte, avec de courts $texte, $spam mots et sans $spam mots) mais je n'ai jamais eu cette erreur. Alors, quel genre de textes à mes utilisateurs de soumettre à l'origine de cette erreur?
if (strposab($text, $spam, 1)) {
echo "Email addresses and URLs not allowed here";
die;
}
$spam = array('http','www','hotmail','yahoo','gmail','msn');
function strposab($haystack, $needles=array(), $offset=0) {
$chr = array();
foreach($needles as $needle) {
$res = strpos($haystack, $needle, $offset);
if ($res !== false) $chr[$needle] = $res;
}
if(empty($chr)) return false;
return min($chr);
}
Deuxième question:
Pour certaines raisons, cette fonction ne filtre pas le premier mot de la chaîne.
Par exemple, dans cette chaîne de fonction ne trouve pas le mot "hotmail":
$text = 'hotmail test test test test';
mais dans cette chaîne, il trouve le mot "hotmail":
$text = 'test hotmail test test test test';
1
au lieu de 0
que le décalage de départ, et que vos utilisateurs sont en soumettant une chaîne vide/caractère unique.OriginalL'auteur user1406271 | 2013-04-27
Vous devez vous connecter pour publier un commentaire.
À la première question:
Le plus souvent, à un point que vous passez une chaîne vide dans votre fonction.
Offset
dans lestrpos
appel indique à partir de quel personnage il doit commencer la recherche pour$needle
. Il est basé sur 0, donc si vous souhaitez démarrer à partir du commencement absolu, vous soit le mettre à 0, ou de les omettre (la valeur par défaut est 0.)À la deuxième question:
Comme mentionné avant, le décalage est de 0, donc si
$needle
que vous recherchez exactement dans le début de$haystack
, il ne peut pas être trouvé, si$offset
est 1. Avec$offset = 1
ce serait comme si vous êtes à la recherche dans une chaîne de caractères qui ressemble à ceci:'otmail test test test test'
.Une chose de plus:
Je vous suggérons d'utiliser
stripos
, passtrpos
pour vos besoins, comme il est insensible à la casse et sera également trouver des mots avec des lettres majuscules, si c'est quelque chose que vous pourriez avoir besoin.aucun d'eux n'a été vrai pour moi 🙁
OriginalL'auteur pilsetnieks
La valeur de décalage est supérieur à la longueur de la chaîne à rechercher dans.
OriginalL'auteur Alex
Pour répondre à votre deuxième question, vous avez deux problèmes dans votre code. En supposant que votre chaîne de texte est:
..et si votre déclaration est
Tout d'abord, vous êtes en commençant à l'offset 1, tandis que le mot "hotmail" est à la position 0. En spécifiant un décalage de 1, vous êtes arrivée à l'encontre de la Chaîne:
...et pas
Deuxième de tous, avec "hotmail" être à la position 0, votre strposab() va retourner une valeur de type int(0), qui est une non-valeur Booléenne que lorsqu'il est utilisé dans une expression Booléenne est évaluée à FAUX. Par conséquent, vous devez utiliser l' !== opérateur afin d'éviter le type de la jonglerie. Donc la bonne si la déclaration d'utilisation:
OriginalL'auteur maringtr