我有一个充满十六进制颜色的文档,如下所示。
#123 is a nice colour but #321 is also fine. However, #fe4918 isn't a bad either.
我想旋转它们,这样#123
就会变得#231
,有效地改变配色方案。 #fe4918
会变得#4918fe
.
我知道使用正则表达式,可以选择哈希标签,但不能选择其他标签。
您可以使用正则表达式来做到这一点...
preg_replace('/#(['da-f])(['da-f])(['da-f])(?:(['da-f])(['da-f])(['da-f]))?/i', '#$2$5$3$6$1$4', $str)
代码板
它的工作原理是不区分大小写的十六进制数字 3 或 6 次,然后使用匹配的组反转它们。
或者,您可以将它与简单的正则表达式和回调与 preg_replace_callback()
一起使用并使用 strrev()
,但我认为上面的例子已经足够清楚了。
您可以使用以下内容进行匹配:
#(['da-f]{2})(['da-f]{2})(['da-f]{2})|#('d)('d)('d)
并替换为:
#'2'5'3'4'1'6
查看正则表达式演示
您可以使用分支重置组来处理具有相同捕获组编号的两种情况:
$str = preg_replace('~#(?|([a-f'd]{2})([a-f'd]{4})|([a-f'd])([a-f'd]{2}))~i',
'#$2$1', $str);
您可以使用正则表达式和 strrev(( 的组合:
#([a-f0-9]+)
在PHP
中,这将是:
<?php
$string = "#123 is a nice colour but #321 is also fine. However, #fe4918 isn't a bad either.";
$regex = '~#([a-f0-9]+)~';
$string = preg_replace_callback(
$regex,
function($match) {
return '#'.strrev($match[1]);
},
$string
);
echo $string;
// #321 is a nice colour but #123 is also fine. However, #8194ef isn't a bad either.
?>
您可以单独在正则表达式中执行此操作,但上述逻辑似乎非常清晰(并且可以在几个月内维护(。
查看有关 ideone.com 的演示。