0

我是 PHP 新手,如果有人已经在这里回答了,我很抱歉,我搜索了很多帖子但没有成功,因此问了。

我有很大的文本块并且想要输出这样它应该返回前 250 个字符然后完成它直到句子结束。

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

有人可以在正确的方向上帮助我吗?谢谢。

4

4 回答 4

2

.假设您可以用、?或之一来分隔句子的结尾!

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

更新的演示

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

于 2013-08-23T21:02:30.980 回答
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_replacejust 用前两个部分替换整个字符串。

输入:

Lorem ipsum dolor sit amet, consectetur adipiscing elit。Nulla pharetra dignissim mauris,pretium v​​iverra justo tempus 在。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, a fringilla odio quam eu lacus。Nulla congue quam nisi,sed posuere sapien interdum posuere。Etiam 在 nibh felis。Sed ac ipsum ut velit dapibus mollis。Mauris ut ante ante。Pellentesque at posuere libero, sed posuere risus。

输出:

Lorem ipsum dolor sit amet, consectetur adipiscing elit。Nulla pharetra dignissim mauris,pretium v​​iverra justo tempus 在。Mauris nisl lectus, accumsan pretium ipsum ac, fringilla vehicula tellus。Proin ante mauris, consequat sed mollis id, euismod ac turpis。

https://eval.in/44807

于 2013-08-23T21:07:04.787 回答
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);
于 2013-08-23T21:18:11.707 回答
1

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

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);
        }
    }
}
于 2013-08-23T21:28:52.703 回答