在字符串处拆分并保持周期

Splitting at string and keeping periods

我正试图在 .!?在保留它们的同时,但由于某种原因它无法正常工作。我做错了什么?

$input = "hi i am1. hi i am2.";
$inputX = preg_split("~[.!?]+\K\b~", $input); 

print_r($inputX);

结果:

Array ( [0] => hi i am1. hi i am2. )

预期结果:

Array ( [0] => hi i am1. [1] => hi i am2. )

希望这就是您所期待的

$input = "hi i am1. hi i !am?2."; // i have added other ?! symbols also

$inputX = preg_split("/(\.|\!|\?)/", $input,-1,PREG_SPLIT_DELIM_CAPTURE); 

print_r($inputX)

输出:

Array ( [0] => hi i am1 [1] => . [2] => hi i [3] => ! [4] => am [5] => ? [6] => 2 [7] => . [8] => )

我不确定你是否需要做一个 preg_split() 但如果可以的话试试 preg_match_all():

$input = "hi i am1. hi i am2.";
preg_match_all("/[^\.\?\!]+[\.\!\?]/", $input,$matched);
print_r($matched);

给你:

Array
(
    [0] => Array
        (
            [0] => hi i am1.
            [1] =>  hi i am2.
        )
)

不用\b试试,我觉得这里是多余的(如果不是的话)。

$input = "hi i am1. hi i am2.?! hi i am2.?";
$inputX = preg_split("~(?>[.!?]+)\K(?!$)~", $input); 

print_r($inputX);

(?!$) 是为了避免在匹配的元素上拆分,如果它在字符串的末尾,那么不会有额外的空结果。原子分组 ?> 是为了避免在字符串末尾有一系列字符时拆分,例如 ?!.(如果没有原子分组,它将在 ! 上拆分,最后的结果将是单个字符 .)。输出:

Array
(
    [0] => hi i am1.
    [1] =>  hi i am2.?!
    [2] =>  hi i am2.?
)