0

编辑:好的,我无法阅读,感谢 Shrapnel 上校的帮助。如果有人来这里寻找相同的答案... print_r(preg_split('/([\!|\?|\.|\!\?])/', $string, null, PREG_SPLIT_DELIM_CAPTURE));

有没有办法在一组分隔符上拆分字符串,并在拆分后保留分隔符的位置和字符?

例如,使用! ? . !? 转这个分隔符:

$string = 'Hello. A question? How strange! Maybe even surreal!? Who knows.';

进入这个

array('Hello', '.', 'A question', '?', 'How strange', '!', 'Maybe even surreal', '!?', 'Who knows', '.');

目前我正在尝试print_r(preg_split('/([\!|\?|\.|\!\?])/', $string));将分隔符捕获为子模式,但我运气不佳。

4

3 回答 3

0

您还可以在 、 或 之后的空格.上进行!拆分。但这只有在你能保证这样一个字符后有空格的情况下才能使用。?!?

你可以做到这一点,通过匹配一个但有一个积极的回顾(<=\.|!?|?|!)::这使得正则表达式

'/(?<=\.|\?|!) /'

然后,您必须检查匹配的字符串是否以!?: 结尾,如果是,则对最后两个进行子字符串化。如果没有,您将不得不对最后一个字符进行子串化。

于 2010-05-20T17:56:43.197 回答
0

只需将 PREG_SPLIT_DELIM_CAPTURE 添加到 preg_split 函数:

$str = 'Hello. A question? How strange!';
$var = preg_split('/([!?.])/', $str, 0, PREG_SPLIT_DELIM_CAPTURE);
$var = array(
    0 => "Hello",
    1 => ".",
    2 => " A question",
    3 => "?",
    4 => " How strange",
    5 => "!",
    6 => "",
);
于 2010-05-20T17:49:08.197 回答
0

你的评论听起来你已经找到了相关的标志,但是你的正则表达式有点不对劲,所以我还是要添加这个:

preg_split('/(!\?|[!?.])/', $string, null, PREG_SPLIT_DELIM_CAPTURE);

请注意,这将在第一个字符串之后的每个字符串的开头留下空格,因此您可能也希望将它们全部运行trim()

结果:

$string = 'Hello. A question? How strange! Maybe even surreal!? Who knows.';
print_r(preg_split('/(!\?|[!?.])/', $string, null, PREG_SPLIT_DELIM_CAPTURE));

Array
(
    [0] => Hello
    [1] => .
    [2] =>  A question
    [3] => ?
    [4] =>  How strange
    [5] => !
    [6] =>  Maybe even surreal
    [7] => !?
    [8] =>  Who knows
    [9] => .
    [10] => 
)
于 2010-05-20T17:49:17.650 回答