Faut dire aussi qu'on manque d'infos sur la structure des données à traiter. Et je me suis penché (sans tomber) sur la grosse regex du premier "if", et plusieurs choses m'ont frappé (aïe !) :
- Elle est bourrée de parenthèses inutiles, vu que l'alternative a priorité sur tout sauf les parenthèses.
- Il y a une classe [A-Za-z] alors qu'elle est traitée avec l'option d'insensibilité à la casse.
- Un caractère '-' échappé on ne sait pourquoi.
Fort de ces remarques, ladite regex peut-être modifiée comme suit :
/(?:at|) ($ville)(?: \d+| -|,? [A-Z]{2}|,?$| \/|, [A-Z]+| \()/i
C'est quand même un poil plus sobre.
Par ailleurs, sur les trois paires de parenthèses qui restent, une seule a besoin d'être capturante, autant changer les autres par des non-capturantes (ce que j'ai fait), c'est pas une énorme optimisation, mais il n'y a pas de petits profits, et c'est une bonne habitude à prendre. Du coup, dans le code qui suit, il faut bien sûr utiliser $1 et non $2.
Avec plus d'infos sur les fichiers parcourus, il serait peut-être possible de faire encore mieux, notemment en termes d'optimisation.
En effet, plusieurs problèmes se posent en la matière avec cette regex, par exemple avec le terme ",? [A-Z]{2}" de l'alternative : son texte-cible risque le cas échéant d'être reconnu à l'avance par la regex $ville (telle que je la soupçonne d'être conçue) avec ce que ça implique de retours arrière. De plus, le terme ", [A-Z]+" (", [A-Za-z]+" dans sa version d'origine) est quasiment équivalent. En fait, plus j'y réfléchis, et moins je vois quelle logique conduit à avoir ces deux termes dans une alternative qui termine une regex. La virgule optionnelle dans l'expression ",? [A-Z]{2}" est redondante : le cas avec virgule est déjà intégralement traité par l'expression ", [A-Z]+". Donc on peut très bien la transformer en " [A-Z]{2}" sans que ça change quoique ce soit au résultat final. Résultat final qui a de forte chances de comporter des caractères en trop ou au contraire des caractères manquants (enfin, ça dépend de comment sont foutus les fichiers). En tout cas, on a cinq termes de l'alternative commençant par un espace : on pourrait factoriser, ça ne mange pas de pain.
Une dernière remarque : je sais que ça n'a rien d'incorrect, mais je suis toujours un peu perplexe devant une alternative à terme vide, telle que ce "(at|)" qui débute la regex. J'ai mon Friedl sur les genoux, mais j'ai beau chercher je n'arrive pas à retrouver si ç'a un quelconque intérêt par rapport à "(at)?" (si on ne fait rien de la capture, bien sûr).
Partager