有没有办法在使用php explode或其他类似功能时保持分隔符?

时间:2010-05-30 09:55:42

标签: php

例如,我应该根据句子边界分割文章,例如“.”,“?”,“!”和“:

但是众所周知,无论preg_split还是explode是否正常,它们都会删除分隔符。

任何帮助都会非常感激!

修改

我只能提出下面的代码,虽然效果很好。

$content=preg_replace('/([\.\?\!\:])/',"\\1[D]",$content);

谢谢!!!大家。得到3个答案只需五分钟!我必须道歉,因为在提问之前无法仔细查看PHP手册。抱歉。

4 个答案:

答案 0 :(得分:19)

我觉得这值得补充。您可以在""之后保留分隔符。使用regex lookahead分割字符串:

$input = "The address is http://stackoverflow.com/";
$parts = preg_split('@(?=http://)@', $input);
// $parts[1] is "http://stackoverflow.com/"

如果分隔符具有固定长度,则可以在"之前保留分隔符。部分使用lookbehind:

$input = "The address is http://stackoverflow.com/";
$parts = preg_split('@(?<=http://)@', $input);
// $parts[0] is "The address is http://"

在大多数情况下,此解决方案更简单,更清洁。

答案 1 :(得分:15)

使用preg_split时,您可以设置标志 PREG_SPLIT_DELIM_CAPTURE 并捕获分隔符。然后你可以把每一对2 n 和2 n +1并重新组合在一起:

$parts = preg_split('/([.?!:])/', $str, -1, PREG_SPLIT_DELIM_CAPTURE);
$sentences = array();
for ($i=0, $n=count($parts)-1; $i<$n; $i+=2) {
    $sentences[] = $parts[$i].$parts[$i+1];
}
if ($parts[$n] != '') {
    $sentences[] = $parts[$n];
}

注意将拆分分隔符打包到一个组中,否则将不会捕获它们。

答案 2 :(得分:8)

带有preg_split标记的

PREG_SPLIT_DELIM_CAPTURE

将使用delimiter = 0match = 1

返回匹配数组

答案 3 :(得分:0)

试试T-Regx

<?php
$parts = pattern('([.?!:])')->split($string);