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

use*_*889 14 php

例如,我有一篇文章应根据句子边界分割,如" ."," ?"," !"和" :".

但正如大家都知道,无论是preg_splitexplode功能,它们都删除分隔符.

任何帮助将非常感激!

编辑:

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

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

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

wav*_*ode 19

我觉得这值得补充.您可以使用正则表达式前瞻分割将分隔符保留在"after"字符串中:

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

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

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

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


Gum*_*mbo 15

使用和捕获分隔符时,可以设置标志PREG_SPLIT_DELIM_CAPTUREpreg_split.然后你可以把每对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];
}
Run Code Online (Sandbox Code Playgroud)

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


Sha*_*are 9

preg_splitPREG_SPLIT_DELIM_CAPTURE国旗

将返回匹配数组delimiter = 0,match = 1