2010-05-20 49 views
0

编辑:好的,我无法阅读,感谢Col Shrapnel的帮助。如果有人来这里寻找同样的东西来回答...... print_r(preg_split('/([\!|\?|\.|\!\?])/', $string, null, PREG_SPLIT_DELIM_CAPTURE));分割字符串时保留分隔符

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

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

$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));捕捉分隔符为子模式,但我没有多少运气。

+2

为什么不阅读函数的手册页?可能会有答案吗?尽管要将分隔符作为子模式来使用,您可以使用preg_match_all。但分割是最好的。只需养成一个习惯,先参阅手册页 – 2010-05-20 17:42:19

+1

Erp。刚回到网页上,我现在要去眼镜商买一副眼镜:/我要失明了。 谢谢你让我再看一遍:P – JoeC 2010-05-20 17:46:07

+0

请注意,你正在使用一个字符类。 '[\!| \?| \。| \!\?]'指的是字符'!','''','?'和'.'。你可能想要的是:'(!| \?| \。|!\?)'。或者用一个字符类:'([?。] |!\ ??)'。 – Gumbo 2010-05-20 17:50:54

回答

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] => 
) 
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 => "", 
); 
0

您还可以将.!?!?后分裂的空间。但只有在可以保证在这样的角色后面有空格的情况下才能使用。

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

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

然后,你就必须检查串与!?匹配结束:如果是这样,则将最后两个子串串起来。如果不是,则必须对最后一个字符进行子串处理。