2009-08-27 3 views
1

Я пишу функцию, которая заменяет длинный шестиугольный цвет (#334455) коротким (#345). Это можно сделать только тогда, когда каждый цвет в шестнадцатеричном виде кратен 17 (каждая шестнадцатеричная пара состоит из одних и тех же символов).PCRE для замены # 334455 hex # 345

например. #EEFFCC заменен на #EFC, но # EDFFCC не заменен ничем.

Я хочу сделать это с помощью одного preg_replace() вызова без каких-либо пользовательских обратных вызовов.

Я уже пробовал это:

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

Но что укорачивает все гексы, а не только гекса с теми же персонажами в каждой паре. Я не могу понять, как сопоставлять только пары одного и того же символа.

Пожалуйста, помогите.

+0

[0-9a-е], вероятно, работать лучше, чем [0-е]. –

ответ

4

Попробуйте - вам просто нужно использовать backreferences в матче сам

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

Спасибо, что отлично работает, я не знал, что обратные ссылки могут использоваться и в шаблонах. Это привносит совершенно новое измерение в регулярное выражение. :) –