2009-08-27 7 views
1

J'écris une fonction qui remplace la longue couleur codée hexadécimale (#334455) avec un court (#345). Cela ne peut être fait que lorsque chaque couleur en hex est multiple de 17 (chaque paire hexagonale est composée des mêmes caractères).PCRE pour remplacer # 334455 hex aveC# 345

par exemple. #EEFFCC est remplacé par #EFC, mais # EDFFCC n'est pas remplacé par quoi que ce soit.

Je veux faire cela avec appel unique preg_replace() sans aucun rappel personnalisé.

Je l'ai déjà essayé ceci:

$hex = preg_replace('/([0-f]){2}([0-f]){2}([0-f]){2}/i', '\1\2\3', $hex); 

Mais qui réduit le délai de chaque paire tous les hexagones, et pas seulement les hexagones avec mêmes caractères. Je ne peux pas comprendre comment faire correspondre seulement des paires de même caractère.

Aidez-nous s'il vous plaît.

+0

[0-9a-f] serait probablement mieux que [0-f]. –

Répondre

4

Essayez ceci - vous avez juste besoin d'utiliser le backreferences dans le match se

$hex = preg_replace('/([0-f])\1([0-f])\2([0-f])\3/i', '\1\2\3', $hex); 
+0

Merci, cela fonctionne parfaitement, je ne savais pas que les références peuvent également être utilisés dans les modèles. Cela apporte une toute nouvelle dimension aux expressions rationnelles. :) –

Questions connexes