optimisation de plusieurs regexp en une seule.

optimisation de plusieurs regexp en une seule. - PHP - Programmation

Marsh Posté le 21-09-2007 à 18:39:30    

Bonjour à tous. Je suis en train d'écrire un soundex_fr. Il est presque fini, mais je me retrouve avec pas mal de choses qui sont optimisables, du moins en suis-je persuadé!
 
Dans mon code, j'ai un paquet de lignes comme celles-ci. Je n'ai pas bien saisi le concept des {1} ou \1 dans la regexp et je ne trouve pas de documentation qui l'explique réellement. Alors si une bonne âme sait le faire, je veux bien un coup de pouce.
 
$sIn = preg_replace( '`^ENB`', 'ANB', $sIn );
$sIn = preg_replace( '`^ENCH`', 'ANCH', $sIn );
$sIn = preg_replace( '`^END`', 'AND', $sIn );
$sIn = preg_replace( '`^ENF`', 'ANF', $sIn );
 
La cerise sur le gâteau serait de pouvoir inclure à la regexp du dessus la ligne suivante aussi. Mais là, je ne sais pas si c'est faisable, vu que le 'C' devient 'K'
 
$sIn = preg_replace( '`^ENC`', 'ANK', $sIn );
 
 
 
Merci.

Reply

Marsh Posté le 21-09-2007 à 18:39:30   

Reply

Marsh Posté le 21-09-2007 à 20:05:37    

Bon ben j'ai trouvé une première optimisation:
 
$sIn = preg_replace( '`^EN([BDF]|CH)`', 'AN$1', $sIn );
 
Les parenthèses définissent une capture qu'on récupère avec $1 dans le remplacement.
 
Reste à fusionner avec la dernière ligne. Mais là, gros doute.
 

Reply

Marsh Posté le 22-09-2007 à 07:40:36    

C'est faisable en passant par l'option e ou par preg_replace_callback mais si c'est juste pour une regexp particulière il paraîtrait fortement logique de laisser ça dans un preg_replace à part.  
 
On voit directement le cas particulier en lisant le code et ça évite de rentrer dans un niveau de complexité supplémentaire.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 22-09-2007 à 09:02:38    

Je jetterai un œil à ces fonctions. Merci! C'est vrai que déjà, dans le code original, ça me remplace en plusieurs endroits 15 lignes en une.
 
Pour le code, vu qu'à terme je compte le diffuser, il sera fourni en commentaires ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed