如何使用substr在行的最后一个点后面包括分隔符?

时间:2014-03-27 21:34:49

标签: php html regex

我已经得到了以下代码,将内容分成三个部分,中间有两个分隔符,但它正在切入句子之间,我想在之后拆分(调用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;

4 个答案:

答案 0 :(得分:0)

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

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

如果您确定有3个句子用&#34;。&#34;分隔,请使用:

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

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

print_r($text);

有关explode()的更多信息,请点击此处: http://pl1.php.net/explode

说实话,这是非常微弱的解决方案。首先,你不能确定你只有3个句子而且他们总是被&#34; dot&#34;标志。其次,可能会出现&#34; dot&#34;在句子的中间,这不是句号,例如$ 3.45。如果我是你,我会尝试包含一些可以分隔内容的内容,例如&#34; \ r \ n&#34; (新的线路标志),然后通过这个创建你的零件爆炸....

希望有所帮助。

答案 1 :(得分:0)

我的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

答案 2 :(得分:0)

这个怎么样?请注意,在这种情况下,最后(第三)部分在大多数情况下会更短。您可以操纵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坐下来,精神上的精神。 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,坐在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是一种前庭丝绒。 Nam et pharetra odio。在sapien ut fermentum中保留feugiat。 Donec eu arcu orci。

答案 3 :(得分:-1)

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

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);
}