PHP正则表达式找到前n个字符并完成它直到句末

时间:2013-08-23 20:50:37

标签: php regex

我是PHP的新手,对不起,如果有人已经在这里回答,我搜索过很多帖子但是没有成功,因此要求。

我有大文本块,想要输出,它应该返回前250个字符,然后完成直到句末。

$output= preg_replace('/([^?!.]*.).*/', '\\1', substr($string, 250));

有人可以帮我正确的方向吗?感谢。

4 个答案:

答案 0 :(得分:1)

假设您可以按.?!之一划分句子的结尾:

$output = preg_replace('/(^.{0,249}[^!?.]*.).*$/s', '$1', $string);

Updated Demo

(添加了s修饰符以处理多行字符串)。

答案 1 :(得分:1)

这有效:

$output = preg_replace("/^(.{250})([^\.]*\.)(.*)$/", "\\1\\2", $text);

RegEx有三个部分:

^            # Beginning of the string
(.{250})     # 250 characters of anything
([^\.]*\.)   # Any number of non-periods, followed by a single period
(.*)         # Anything
$            # End of the string

然后preg_replace只用前两个部分替换整个字符串。

输入:

  

Lorem ipsum dolor坐下来,精神上的精神。 Nulla pharetra dignissim mauris,pretium v​​iverra justo tempus at。 Mauris nisl lectus,accumsan pretium ipsum ac,fringilla vehicula tellus。 Proin ante mauris,consequat sed mollis id,euismod ac turpis。 Mauris tellus massa,volutpat sit amet lectus at,imperdiet mollis lacus。 Praesent dapibus,lacus vel egestas convallis,magna metus pharetra mi,fringilla odio quam eu lacus。 Nulla congue quam nisi,sed posuere sapien interdum posuere。 Etiam in nibh felis。 Sed ac ipsum ut velit dapibus mollis。 Mauris吃了赌注。 Pellentesque at posuere libero,sed posuere risus。

输出:

  

Lorem ipsum dolor坐下来,精神上的精神。 Nulla pharetra dignissim mauris,pretium v​​iverra justo tempus at。 Mauris nisl lectus,accumsan pretium ipsum ac,fringilla vehicula tellus。 Proin ante mauris,consequat sed mollis id,euismod ac turpis。

https://eval.in/44807

答案 2 :(得分:1)

这不是一个完整的RegEx解决方案,但它可能适合您

$foo = 'This is an example paragraph. It has many sentences.';

// Split the paragraph $foo into sentences
$bar = preg_split('/[.?!]/', $foo);
$bar = array_slice($bar, 0, -1);

$bas = '';
foreach ($bar as $bax) {
    // Concatenate each sentence
    $bas .= "$bax.";

    if (strlen($bas) >= 250) {
        // If the output string is longer than 250 characters
        // don't concatenate any more sentences
        break;
    }
}

// Final paragraph
var_dump($bas);

答案 3 :(得分:1)

这里根本不需要正则表达式。简单的字符串操作将是一个更好的解决方案。问题归结为在字符串的偏移量249之后找到第一个句点后跟一个空格。你不需要正则表达式来做这件事。您应该能够从字符串中的偏移量249开始搜索.[space]。执行此操作的功能可能如下所示:

function get_text_blurb_to_sentence_end ($input_text, $ideal_length = 250) {
    if (strlen($input_text) <= $ideal_length) {
        return $input_text;
    } else {
        $end_of_sentence = strpos('. ', $input_text, $ideal_length - 1);
        if (false === $position_of_period_space) {
            // no end of sentence found just return $ideal_length characters
            return substr($input_text, 0, $ideal_length);
        } else {
            return substr($input_text, 0, $end_of_sentence + 2);
        }
    }
}