拆分字符串时保留分隔符

时间:2010-05-20 17:40:21

标签: php regex explode preg-split

编辑:好的,我无法阅读,感谢Col. 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));将分隔符捕获为子模式,但我没有太多运气。

3 个答案:

答案 0 :(得分: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 => "",
);

答案 1 :(得分: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] => 
)

答案 2 :(得分:0)

您还可以在.!?!?之后拆分空格。但是只有在你能保证在这样的角色之后有空格的情况下才能使用它。

你可以通过匹配但正面回顾来实现这一点:(<=\.|!?|?|!):这会使正则表达式

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

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