Dans PHP, la fonction strRist () est une fonction utilisée pour trouver la première occurrence d'une sous-chaîne spécifiée dans une chaîne. Cette fonction est insensible à la casse et est souvent utilisée pour la correspondance et la récupération du texte. Cependant, lorsque des recherches fréquentes sont nécessaires en grande quantité de texte, les performances de StrRist () peuvent devenir un goulot d'étranglement, en particulier lorsqu'ils traitent avec un grand texte. Par conséquent, l'amélioration de l'efficacité de cette fonction est cruciale pour améliorer les performances des applications.
L'utilisation de base de la fonction strRist () est la suivante:
<span><span><span class="hljs-title function_ invoke__">stristr</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$needle</span></span><span>): </span><span><span class="hljs-keyword">string</span></span><span>|</span><span><span class="hljs-literal">false</span></span><span>
</span></span>$ Haystack : la chaîne principale à rechercher.
$ aiguille : la sous-chaîne à trouver.
Cette fonction renvoie la partie de $ Haystack après la première occurrence de $ aiguille , ou fausse si elle n'est pas trouvée.
Bien que StrRist () soit simple et facile à utiliser, ses performances ne sont pas bonnes pour les recherches de texte à grande échelle, en particulier lorsque plusieurs opérations de recherche ou de très grands fichiers texte sont impliqués.
strRist () nécessite la numérisation du caractère de la chaîne de sac de hayst de $ par le caractère jusqu'à ce que $ aigule soit trouvé ou itérante via la botte de hayst $ complète. Si vous effectuez plusieurs opérations de recherche dans une chaîne plus grande, chaque fois, il est possible de scanner la chaîne entière à partir de zéro. Cette méthode est relativement inefficace pour les opérations qui nécessitent des recherches fréquentes, en particulier lors du traitement du contenu des fichiers ou de grandes quantités de données.
Par exemple, supposons que nous ayons un fichier journal avec beaucoup de texte et que nous devons rechercher plusieurs mots clés différents. Si strRist () est appelé chaque recherche, plusieurs traversées inutiles seront causées, ce qui affectera les performances.
Si vous vous souciez uniquement de savoir s'il existe une sous-chaîne et que vous n'avez pas besoin de retourner le contenu après la sous-chaîne, vous pouvez envisager d'utiliser la fonction StrPos () . Par rapport à StrPOS () , StrPOS () ne renvoie que la position de la première correspondance et n'a pas besoin de renvoyer l'intégralité du contenu de la sous-chaîne.
<span><span><span class="hljs-variable">$haystack</span></span><span> = </span><span><span class="hljs-string">"This is a large text example that we are working with."</span></span><span>;
</span><span><span class="hljs-variable">$needle</span></span><span> = </span><span><span class="hljs-string">"large"</span></span><span>;
</span><span><span class="hljs-variable">$position</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strpos</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">$position</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">"Found at position: "</span></span><span> . </span><span><span class="hljs-variable">$position</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">"Not found."</span></span><span>;
}
</span></span>La complexité temporelle de StrPOS () est O (n), où n est la longueur de la botte de foin $ , en évitant le fonctionnement supplémentaire de retour de chaîne de StrPos () .
Si plusieurs opérations de recherche sont requises et que plusieurs analyses de chaînes sont souhaitées à éviter, vous pouvez envisager d'utiliser des expressions régulières. Les expressions régulières peuvent correspondre à plusieurs modèles à la fois sans plusieurs appels pour trouver des fonctions. PHP fournit des fonctions telles que preg_match () et preg_match_all () pour implémenter cette fonction.
<span><span><span class="hljs-variable">$haystack</span></span><span> = </span><span><span class="hljs-string">"This is a large text example that we are working with."</span></span><span>;
</span><span><span class="hljs-variable">$pattern</span></span><span> = </span><span><span class="hljs-string">"/large|text|example/i"</span></span><span>; </span><span><span class="hljs-comment">// Utilisez une correspondance régulière de plusieurs mots clés</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">preg_match</span></span><span>(</span><span><span class="hljs-variable">$pattern</span></span><span>, </span><span><span class="hljs-variable">$haystack</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Match found!"</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">"No match found."</span></span><span>;
}
</span></span>Avec des expressions régulières, nous pouvons faire correspondre plusieurs sous-chaînes dans un scan, évitant les appels répétés vers strRist () .
Si seulement certains contenus de texte doivent être remplacés ou supprimés pendant le processus de recherche, il sera plus efficace de traiter le texte via str_replace () à l'avance. Étant donné que str_replace () peut effectuer plusieurs opérations de remplacement en une seule traversée, elle est généralement plus rapide que de chercher une par une.
<span><span><span class="hljs-variable">$haystack</span></span><span> = </span><span><span class="hljs-string">"This is a large text example that we are working with."</span></span><span>;
</span><span><span class="hljs-variable">$search</span></span><span> = [</span><span><span class="hljs-string">"large"</span></span><span>, </span><span><span class="hljs-string">"text"</span></span><span>, </span><span><span class="hljs-string">"example"</span></span><span>];
</span><span><span class="hljs-variable">$replace</span></span><span> = [</span><span><span class="hljs-string">"big"</span></span><span>, </span><span><span class="hljs-string">"word"</span></span><span>, </span><span><span class="hljs-string">"sample"</span></span><span>];
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_replace</span></span><span>(</span><span><span class="hljs-variable">$search</span></span><span>, </span><span><span class="hljs-variable">$replace</span></span><span>, </span><span><span class="hljs-variable">$haystack</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$result</span></span><span>;
</span></span>Cette approche convient particulièrement aux situations où le texte doit être prétraité.
Lorsque plusieurs recherches sont faites sur de grands fichiers texte, assurez-vous qu'il n'y a pas d'allocations de mémoire inutiles et de copie de chaque recherche. Les performances peuvent être optimisées en utilisant des pointeurs de mémoire et des lectures de streaming, en particulier lorsqu'ils traitent de très grandes données de texte.
<span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'large_file.txt'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-keyword">while</span></span><span> ((</span><span><span class="hljs-variable">$line</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)) !== </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">stristr</span></span><span>(</span><span><span class="hljs-variable">$line</span></span><span>, </span><span><span class="hljs-string">'needle'</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Found in line: "</span></span><span> . </span><span><span class="hljs-variable">$line</span></span><span>;
}
}
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span></span>Dans le code ci-dessus, nous lisons le fichier ligne par ligne et le recherchons, ce qui peut réduire l'utilisation de la mémoire et ne chargera pas le fichier entier en mémoire à la fois.
Pour les scénarios de recherche fréquents, l'adoption d'une stratégie de mise en cache peut améliorer considérablement les performances. Par exemple, cachez les résultats recherchés pour éviter les recherches répétées pour la même sous-chaîne. Vous pouvez utiliser l'extension APCU de PHP ou les outils de mise en cache externes tels que Redis pour le stockage de cache.
<span><span><span class="hljs-variable">$haystack</span></span><span> = </span><span><span class="hljs-string">"This is a large text example that we are working with."</span></span><span>;
</span><span><span class="hljs-variable">$needle</span></span><span> = </span><span><span class="hljs-string">"large"</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$cachedResult</span></span><span> = </span><span><span class="hljs-title function_ invoke__">apcu_fetch</span></span><span>(</span><span><span class="hljs-variable">$needle</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Found from cache: "</span></span><span> . </span><span><span class="hljs-variable">$cachedResult</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stristr</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-title function_ invoke__">apcu_store</span></span><span>(</span><span><span class="hljs-variable">$needle</span></span><span>, </span><span><span class="hljs-variable">$result</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Found: "</span></span><span> . </span><span><span class="hljs-variable">$result</span></span><span>;
}
</span></span>Cela réduit les frais généraux des recherches répétées, en particulier lors du traitement du texte complexe, et le cache peut améliorer considérablement la vitesse de réponse de l'application.
StrRist () est une fonction très pratique en PHP, mais en ce qui concerne l'optimisation des performances, son balayage caractéristique peut entraîner des goulots d'étranglement lorsqu'ils traitent de grands textes ou de recherches fréquentes. En adoptant des méthodes alternatives telles que STRPOS () , des expressions régulières, un traitement d'optimisation de la mémoire et des stratégies de cache, nous pouvons améliorer efficacement l'efficacité de la recherche, réduire la charge du système et optimiser les performances du traitement de texte à grande échelle.