fix: l'optimisation du collecteur empêchait de retrouver les balises avec une casse mixte
Par défaut le collecteur de balises html cherche la version minuscule uniquement (<ul) si il detecte que le document de contient aucune version de la balise en majuscule (<UL).
Malheureusement si on utilise le collecteur pour parser du XML avec des balises à casse mixte (<Titre), ça ne trouve rien du tout.
On corrige en considérant que si la balises cherchée passée en argument n'est pas déjà en minuscules, alors il ne faut pas optimiser la recherche, pour être certain de trouver les balises dans toutes leurs formes. Dans le cas d'une balise passée directement en minuscules, on garde l'heuristique existante (recherche optimisée si pas de version majuscule de la balise dans le document).
A noter :
- ce trick sert à profiter au maximum du
strposdu collecteur https://git.spip.net/spip/ecrire/-/blob/5.x/src/Texte/Collecteur/AbstractCollecteur.php?ref_type=heads#L272 qui a l'avantage d'être beaucoup plus rapide que le preg_match et permet donc d'arrêter la recherche plus vite - le remplacement du
strpospar unstriposferait perdre tout intérêt pour cette optimisation : selon https://stackoverflow.com/questions/9477984/which-is-the-fast-process-strpos-stripos-or-preg-match-in-php#33354124 on a-
strpos()is 3-16 times faster thanpreg_match() -
stripos()is 2-30 times slower thanstrpos() -
stripos()is 20-100 percent faster thanpreg_match()with the caseless modifier "//i"
-
On voit donc que faire un strpos avant (et donc en plus) d'un preg_match a du sens vu la différence de perf, mais c'est beaucoup moins vrai pour le stripos
- Enfin, en toute rigueur le collecteur est fait pour parser du HTML et pas du XML, pour lequel PHP propose des outils plus complet comme simplexml https://www.php.net/manual/fr/book.simplexml.php mais le collecteur est utilisé par le fonction
extraire_balises()qui fonctionnait historiquement bien sur du XML et donc on essaye de pas casser toutes les compatibilités de code
La PR contient aussi une petite optimisation perf sur le collecteur en évitant de répéter le test sur le str_contains inutilement (il n'a de sens qu'une fois, au départ)
Le fix est à reporter en SPIP 4.4 qui a, en l'état, cassé le comportement de extraire_balises()