将字符串拆分为多个部分,同时保留所有非单词字符

时间:2018-01-30 16:54:25

标签: php regex string encryption

我正致力于加密功能,只是为了好玩(对于非生产环境)。目前正在运行我的加密函数:

encrypt("This is a string.");   

生成以下字符串:

GnulHynkAfdsGknp AfdsGknp Wgbf GknpLnugBuipAfdsCbhgByfg.

这是完美的,正是我想要和期望的 - 然而,现在我正在尝试编写解密函数。每个加密的字符都有一个大写字母后跟3个非大写字母(正如您从上面的例子中看到的那样)。

我的计划是运行preg_split()来获取字符串的不同字母。

这是我当前的PHP代码(模式([A-Z][a-z]{3})):

print_r(preg_split("/([A-Z][a-z]{3})/", $string));

这有几个问题。在测试时,我发现它没有返回我的预期,返回的是:

Array
(
    [0] => 
    [1] => 
    [2] => 
    [3] => 
    [4] =>  
    [5] => 
    [6] =>  
    [7] =>  
    [8] => 
    [9] => 
    [10] => 
    [11] => 
    [12] => 
    [13] => .
)

(通过eval.in

所以这有适当的回报,但它们都是空白的。为什么所有值都是空白的?

我想到的另一件事是我需要在preg_split()返回中包含其他字符,例如空格,逗号,句号等。在我从eval.in获得的回报中,似乎已经包含了最后一段时间。这对于空格和其他角色也是如此,或者我是否需要在这些角色的情况下做一些特别的事情?

2 个答案:

答案 0 :(得分:2)

这些匹配上的“拆分”因此会被删除。您需要preg_match_allPREG_SPLIT_DELIM_CAPTURE使用PREG_SPLIT_NO_EMPTY

print_r(preg_split("/([A-Z][a-z]{3})/",
                   $string,
                   null,
                   PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY));

答案 1 :(得分:1)

您应该删除捕获论坛()并使用preg_match_all

$text = "GnulHynkAfdsGknp AfdsGknp Wgbf GknpLnugBuipAfdsCbhgByfg.";
preg_match_all("/[A-Z][a-z]{3}|(?: |,|\.)/", $text, $match);
print_r($match);

<强>输出

Array
(
    [0] => Array
        (
            [0] => Gnul
            [1] => Hynk
            [2] => Afds
            [3] => Gknp
            [4] =>  
            [5] => Afds
            [6] => Gknp
            [7] =>  
            [8] => Wgbf
            [9] =>  
            [10] => Gknp
            [11] => Lnug
            [12] => Buip
            [13] => Afds
            [14] => Cbhg
            [15] => Byfg
            [16] => .
        )
)