2010-07-07 5 views
0

J'utilise actuellement ce morceau de code pour réduire un texte donné à un format « marquage » valide (uniquement en minuscules, az et moins autorisé) en supprimant/remplacement des caractères non validesOptimize « marquage » regex

 $zip_filename = strtolower($original); 
     $zip_filename = preg_replace("/[^a-zA-Z\-]/g", '-', $zip_filename); //replace invalid chars 
     $zip_filename = preg_replace("/-+/g", '-', $zip_filename); // reduce consecutive minus to only one 
     $zip_filename = preg_replace("/^-/g", '', $zip_filename); // removing leading minus 
     $zip_filename = preg_replace("/-$/g", '', $zip_filename); // remove trailing minus 

Tous des conseils sur la façon de mettre au moins la regex en un seul?

Merci pour votre conseil!

+0

Pourquoi ne pas $ zip_filename = preg_replace ("/ [^ a-zA-Z \ -]/g", '', $ zip_filename);// remplacer les caractères invalides avec rien de travail? – murgatroid99

Répondre

3
$zip_filename = trim(preg_replace("/[^a-z]+/", '-', $zip_filename),'-'); 

Explication:

  1. A-Z est inutile car il devrait être minuscules
  2. Ajout + après le support droit remplacera un ou plusieurs caractères non valides consécutifs
  3. En utilisant trim avec second paramètre - caractère couper le début et la fin du formulaire accélérera le code
  4. Enlever \- à partir de preg_replace prendra également voiture de traits d'union entre caractères invalides/traits d'union consécutifs multiples, en les remplaçant à un seul.
+0

Cela ne s'occupe pas de plusieurs tirets consécutifs, je ne pense pas. –

+0

@Platinum - Vous avez raison. Il ne prend pas non plus en compte les espaces consécutifs ou les tirets de début ou de fin. –

+0

Le platine a raison. 0ßDie - s § $ "% et idsfg SDG $ se traduira par die - s-idsfg-SDG (un trait d'union trop) – Nogga

0

Cela devrait simplifier considérablement ...

$zip_filename = trim(strtolower($original)); 
$zip_filename = preg_replace("/\s\s+|--+|[^a-zA-Z-]/g", '-', $zip_filename); 

Le trim prendra soin des espaces avant et après la chaîne. Notez également les \s\s+ et --+. Ceux-ci sont plus efficaces pour trouver des doublons. Ils seulement correspondent à ces caractères s'il y en a deux ou plus en succession, évitant ainsi des opérations de remplacement inutiles.

Mais techniquement, il serait toujours possible d'avoir des tirets de début ou de fin. Et pour que vous auriez encore besoin de ce ...

$zip_filename = preg_replace("/^-|-$/g", '', $zip_filename); 

(Cette dernière opération ne pouvait pas vraiment être combiné avec l'autre puisque vous utilisez une chaîne de remplacement différent.)

0

Vous aurez rendre le code plus difficile à comprendre/maintenir en combinant ces quatre opérations en une seule.

Vous n'avez pas non plus besoin de la complexité et des performances des opérations basées sur les expressions régulières pour obtenir ce dont vous avez besoin.

La réduction du double pour des signes moins simples peuvent être plus facilement atteint par un appel en forme de boucle à str_replace:

while (substr_count($zip_filename, '--')) { 
    $zip_filename = str_replace('--', '-', $zip_filename); 
} 

Emballage cela dans une méthode de classe bien named abstraire une apparente complexité et de l'aide de la lisibilité du code.

Les deux dernières opérations peuvent être traitées par la fonction trim():

$zip_filename = trim($zip_filename, '-'); 

Vous pouvez remplacer vos opérations à base d'une expression régulière avec quelque chose de moins agressif et sans doute plus facile pour cpu les autres à comprendre:

//replace invalid chars 
$zip_filename = preg_replace("/[^a-zA-Z\-]/g", '-', strtolower($original)); 

// reduce consecutive minus to only one 
while (substr_count($zip_filename, '--')) { 
    $zip_filename = str_replace('--', '-', $zip_filename); 
} 

// remove leading and trailing minus 
$zip_filename = trim($zip_filename, '-');