【问题标题】:Splitting string into sections while maintaining all non-word characters将字符串拆分为多个部分,同时保留所有非单词字符
【发布时间】:2018-07-09 15:31:53
【问题描述】:

我正在开发一个加密功能,只是为了好玩(用于非生产环境)。目前像这样运行我的加密功能:

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 获得的回报中,似乎包含了最后一个时期。对于空格和其他字符也是如此,还是在这些字符的情况下我需要做一些特殊的事情?

【问题讨论】:

  • 尝试使用它作为你的正则表达式:(?=[A-Z][a-z]{3}) with split
  • @Gurman 很好解决了空白值的问题。

标签: php regex string encryption


【解决方案1】:

这些匹配是“拆分”,因此它们被删除。你想要preg_match_all 或使用PREG_SPLIT_DELIM_CAPTUREPREG_SPLIT_NO_EMPTY

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

【讨论】:

  • 太好了,非常感谢!很快就会接受答复
【解决方案2】:

您应该删除捕获组() 并使用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] => .
        )
)

【讨论】:

  • 谢谢。但是空格、斜杠、句号等非单词字符呢?
  • 只需在模式末尾添加|.
  • @CasimiretHippolyte 那行不通,因为它们会与加密字符组合在一起。他们必须是他们自己的选择组 - AbraCadaver 的回答给了我正确的输出
  • @GrumpyCrouton 更新了!
  • @GrumpyCrouton:“那行不通……”,在说之前先测试一下:3v4l.org/B1A7C
猜你喜欢
  • 2014-11-28
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2017-04-04
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
相关资源
最近更新 更多