Dans PHP, StrcSpn () et StrStr () sont deux fonctions de traitement de chaîne très pratiques. strcSpn () est utilisé pour calculer la position du premier caractère dans une chaîne qui ne correspond pas au jeu de caractères spécifié qui est rencontré depuis le début, tandis que StrcSpn () est utilisé pour trouver la première occurrence d'une chaîne dans une autre chaîne. Ces deux fonctions doivent être utilisées ensemble dans certains cas, mais peuvent rencontrer des problèmes courants lorsqu'ils sont utilisés en combinaison. Cet article analysera ces problèmes et fournira des solutions.
strcspn () :
strcspn (String $ haystack, String $ charlist): int
Cette fonction calcule et renvoie la première position de caractère dans $ haystack qui ne correspond à aucun caractère dans $ charlist qui est rencontré dès le début. Si aucun caractère correspondant n'est trouvé, la longueur de la chaîne entière est renvoyée.
strStr () :
strStr (String $ haystack, String $ cela aiguille, bool $ avant_needle = false): chaîne | false
Cette fonction renvoie la position dans la chaîne $ haystack où la sous-chaîne $ aiguille apparaît pour la première fois. S'il est défini sur true , le paramètre $ avant_NEEDE renvoie la pièce avant que $ aigule n'apparaisse.
De nombreux développeurs peuvent rencontrer des problèmes d'ordre confus lors de l'utilisation de ces deux fonctions ensemble. Étant donné que strcspn () renvoie une position, StrStr () est généralement utilisée pour trouver des sous-chaînes à partir d'une position sur une chaîne. S'il est appelé à l'envers accidentellement, cela peut entraîner la position de chaîne requise qui n'est pas correctement située.
Exemple:
<span><span><span class="hljs-variable">$haystack</span></span><span> = </span><span><span class="hljs-string">"Hello, World!"</span></span><span>;
</span><span><span class="hljs-variable">$needle</span></span><span> = </span><span><span class="hljs-string">"World"</span></span><span>;
</span><span><span class="hljs-variable">$charlist</span></span><span> = </span><span><span class="hljs-string">",!"</span></span><span>;
</span><span><span class="hljs-variable">$position</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strcspn</span></span><span>(</span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-variable">$charlist</span></span><span>); </span><span><span class="hljs-comment">// Trouvez l'emplacement de la première marque non commun ou exclamation</span></span><span>
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strstr</span></span><span>(</span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-variable">$needle</span></span><span>); </span><span><span class="hljs-comment">// Trouver "World" Est-ce là $haystack milieu</span></span><span>
</span></span>
Cette méthode ne recherche pas les sous-chaînes basées sur la position obtenue par StrcSpn () . strStr () lèvera toujours les yeux depuis le début de la chaîne.
Avant d'utiliser STRSTR () , vous pouvez calculer la position de départ correcte via StrcSpn () , puis utiliser substr () pour intercepter la sous-chaîne de la botte de Hayst pour assurer la plage de recherche correcte.
<span><span><span class="hljs-variable">$position</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strcspn</span></span><span>(</span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-variable">$charlist</span></span><span>);
</span><span><span class="hljs-variable">$substring</span></span><span> = </span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-variable">$position</span></span><span>); </span><span><span class="hljs-comment">// Obtenez la sous-chaîne à partir de cet emplacement</span></span><span>
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strstr</span></span><span>(</span><span><span class="hljs-variable">$substring</span></span><span>, </span><span><span class="hljs-variable">$needle</span></span><span>); </span><span><span class="hljs-comment">// 在子字符串milieuTrouver "World"</span></span><span>
</span></span>
strcspn () renvoie la longueur de la chaîne lorsqu'aucun jeu de caractères spécifié n'est trouvé, tandis que strcspn () renvoie false si aucune sous-chaîne cible n'est trouvée. Lorsqu'il est utilisé ensemble, si l'exception de la valeur de retour n'est pas prise en compte, elle peut entraîner des erreurs de programme ou une logique peu claire.
Exemple:
<span><span><span class="hljs-variable">$haystack</span></span><span> = </span><span><span class="hljs-string">"Hello, World!"</span></span><span>;
</span><span><span class="hljs-variable">$needle</span></span><span> = </span><span><span class="hljs-string">"PHP"</span></span><span>;
</span><span><span class="hljs-variable">$charlist</span></span><span> = </span><span><span class="hljs-string">",!"</span></span><span>;
</span><span><span class="hljs-variable">$position</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strcspn</span></span><span>(</span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-variable">$charlist</span></span><span>);
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strstr</span></span><span>(</span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-variable">$needle</span></span><span>); </span><span><span class="hljs-comment">// Pas trouvé "PHP",retour false</span></span><span>
</span></span>
Dans le code ci-dessus, STRSTR () renvoie false parce que "PHP" n'est pas dans $ Haystack . Cependant, le développeur ne peut pas gérer faux , entraînant une défaillance ultérieure des opérations.
Avant d'utiliser STRSTR () , vérifiez si la sous-chaîne peut être trouvée avec succès.
<span><span><span class="hljs-variable">$position</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strcspn</span></span><span>(</span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-variable">$charlist</span></span><span>);
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strstr</span></span><span>(</span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-variable">$needle</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Substrat non trouvé!"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Sous-chaîne trouvée:"</span></span><span> . </span><span><span class="hljs-variable">$result</span></span><span>;
}
</span></span>
StrcSpn () et StrStr () sont tous deux des fonctions de manipulation de chaînes, ce qui peut affecter les performances lorsqu'ils sont fréquemment appelés sur une grande quantité de données. Surtout dans les boucles, les calculs répétés de strcSpn () et de strStr () peuvent conduire à des répétitions inutiles, en particulier lorsque plusieurs sous-chaînes ou jeux de caractères sont nécessaires pour rechercher plusieurs fois.
Solution :
Prétraitez la chaîne cible avant la boucle, en évitant les appels répétés dans chaque itération.
<span><span><span class="hljs-variable">$haystack</span></span><span> = </span><span><span class="hljs-string">"Hello, World!"</span></span><span>;
</span><span><span class="hljs-variable">$needle</span></span><span> = </span><span><span class="hljs-string">"World"</span></span><span>;
</span><span><span class="hljs-variable">$charlist</span></span><span> = </span><span><span class="hljs-string">",!"</span></span><span>;
</span><span><span class="hljs-variable">$position</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strcspn</span></span><span>(</span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-variable">$charlist</span></span><span>);
</span><span><span class="hljs-variable">$substring</span></span><span> = </span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-variable">$position</span></span><span>);
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strstr</span></span><span>(</span><span><span class="hljs-variable">$substring</span></span><span>, </span><span><span class="hljs-variable">$needle</span></span><span>);
</span><span><span class="hljs-comment">// Autres opérations</span></span><span>
</span></span>
Des recherches inutilement répétées peuvent être évitées en calculant la position initialement et en extraction des sous-chaînes à traiter.
Lorsque vous utilisez StrcSpn () et StrStr () dans PHP, les problèmes communs rencontrés se concentrent principalement sur l'ordre des appels de fonction, le traitement des valeurs de retour et l'optimisation des performances. Comprendre les valeurs de retour de ces deux fonctions et effectuer des vérifications d'erreur peut-il raisonnablement éviter efficacement les pièges courants. De plus, il est également crucial de traiter efficacement de grandes quantités de données, de prétraitement raisonnable et d'éviter les calculs répétés.
Grâce à l'introduction de cet article, j'espère que tout le monde pourra mieux utiliser ces deux fonctions dans le développement réel pour améliorer la stabilité et l'efficacité du code.