如何使用substr在最后一个点之后包含分隔符


How to include separator after last dot on the line using substr?

我有下面的代码,将内容分成三个部分,中间有两个分隔符,但它在句子之间切割,我想在它分隔的那一行的最后一个点之后分割(调用substr)。

$separator = "<br/>";
$text = stripslashes($article_content); 
$first = ceil(strlen($text) / 3);
$string = substr($text, 0, $first);
$string .= $separator;
$string .= substr($text,$first,$first);
$string .= $separator;
$string .= substr($text,($first*2), $first);
echo $string;

因此,在分隔的第一个子字符串上,它将只在该行上的点后面包含分隔符,这样它就不会打断句子。我看了看www.php.net/substr,但是没有帮助。

编辑

我能够使点工作,但目前不知道如何包括在下一个换行

$separator = "<br/>";
$text = stripslashes($article_content); 
$start = ceil(strlen($text) / 3);
$string = substr($text,0, strpos($text, '.', $start)+1); EDITED HERE
$string .= $separator;
$string .= substr($text,$start,$start);
$string .= $separator;
$string .= substr($text,($start*2), $start);
echo $string;

我不确定这是否是您正在寻找的东西,但我会使用explode()

array explode ( string $delimiter , string $string [, int $limit ] )

如果你确定你有三个句子用"。"隔开,使用:

$text = explode(".", $article_content);

使用print_r()调试输出,如:

print_r($text);

更多关于explode()的信息在这里:http://pl1.php.net/explode

老实说,这是一个很弱的解决方案。首先,你不能确定你只有3个句子,而且它们之间总是用"点"号分开。其次,句子中间可能有"点",那不是句号,例如$3.45。如果我是你,我会尝试包括一些你可以分开的内容,例如"'r'n"(新行符号),然后爆炸创建你的部分....

希望对你有帮助。

我的php不是很好,也许只是做替换而不是第一个分隔符追加

 $string = substr($text, 0, $first);
 $string = preg_replace( '/((?<='.)[^.]*|)$', "<br/>$1", $string);
 $string .= substr($text,$first,$first*2);
 ...

分解的正则表达式

 #  ((?<='.)[^.]*|)$
 (                      # (1 start)
      (?<= '. )              # Ensure a dot behind
      [^.]*                  # Optional non-dot's
   |                       # or
                             # nothing, then put it at the end
 )                      # (1 end)
 $                      # End of string

这个怎么样?请注意,在这种情况下,最后(第三)部分在大多数情况下会更短。你可以对round()函数进行四舍五入或四舍五入。此外,假设每个句子由"."分隔,并且在文本中没有其他出现,这将工作。

在这个例子中,你可以操作你想要的切片的数量,而不仅仅是3个。

<?php
$slices = 3;
$content = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum vehicula dui tempus tincidunt tincidunt. Nunc lorem arcu, blandit non blandit ut, dapibus auctor erat. Donec nec ultrices arcu, non varius risus. Aliquam lacinia ipsum neque, sit amet facilisis lorem sagittis at. Vivamus id ligula vel arcu commodo fermentum. Cras lobortis massa non ornare sagittis. Vivamus augue felis, varius nec ante sit amet, tristique venenatis ligula. Proin ac augue vel orci auctor semper eleifend sit amet orci. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nullam a vestibulum velit. Nam et pharetra odio. Proin feugiat in sapien ut fermentum. Donec eu arcu orci.';
$content = array_filter(array_map('trim', explode('.', $content)));
$take = round(count($content) / $slices, 0, PHP_ROUND_HALF_UP);
$new = array();
for ($i=0; $i < $slices; $i++) { 
    $new[] = implode('. ', array_slice($content, $i * $take, $take)) . '.';
}
$final = implode('<br>', $new);
print_r($final);

结果14句子(5 + 5 + 4):

Lorem ipsum dolor sit met, consecent adiping elite。车辆前庭,对庭,对庭,对庭。爱情是甜蜜的,爱情是甜蜜的,爱情是甜蜜的。做的时候要注意,不要有各种各样的危险。[1][1]矢状体炎;[1]矢状体炎。

Vivamus id ligula vel arcu comcomdo fermentum。大叶凤仙花,无花型矢状花序。鹅毛癣,各种癣癣,舌癣。省、省、省、省、省、省、省、省、省、省、省、省。间作和雄性植物在雄性植物中的作用

Nullam a vestibulum velitNam et pharetra音频。酵母菌中蛋白质的分泌。

你可以取这个字符串,找到大约三分之一,然后寻找最接近的点:

function splitInEqualParts($string, $parts=3, $seperator='<hr />'){
    $partlength= ceil(strlen($string)/ $parts);  // find proper length
    $texts = array();
    $prevCut=0;
    for($i=1; $i<$parts; $i++){
        $prev = strrpos($string, ".", $partlength); // find . in front of the break
        $next = strpos($string, ".", $partlength); // find . after the break
        $cut = $prev<=$next ? $prev : $next; // find out which dot is closest
        $texts[] = substr($string, $prevCut, $cut ); // Cut and save part of text
        $prevCut = $cut; // save for next item
    }
    $texts[] = substr($string, $prevCut+1 ); // Save the last part
    return implode($seperator, $texts);
}