在 PHP 中对字符串重新排序


Re-ordering Strings in PHP

我有一个充满十六进制颜色的文档,如下所示。

#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 的演示。