删除一段文字末尾未完成的句子



这里有一个给定的文本:

宇宙如此之大,令人无法理解。我们的太阳能这个系统只是浩瀚太空中的一个小斑点。而我们的银河系,银河系只是宇宙中数十亿个星系中的一个。

宇宙被认为大约有140亿年的历史。这是一个恒星和星系形成和变化需要很多时间。事实上宇宙仍在膨胀,并将永远如此。

那里有几十亿个星系,每个星系都有几十亿颗恒星。而我们自己的银河系只是其中之一。事实上星系太多了,我们甚至无法将它们全部计算在内。每一个那些星系是巨大的。只是想把你的头裹在这个尺寸上一个星系的大小可能很困难,更不用说整个星系的大小了宇宙

但是,即使宇宙非常大,它也在膨胀。所以它实际上一天比一天大。科学家们认为宇宙始于138亿年前的一次大爆炸从那时起不断扩大。这意味着宇宙在很长一段时间内更大,并且

问题:

文本不时以断句结尾(总是最后一句("这意味着宇宙在很长一段时间内一直在变大&";。我需要能够检测我的文本块何时被这样截断,并在输出文本之前完全删除截断的句子。简言之,应删除以下选项格式不正确的文本结尾。

一句话可能以结尾

-点(.(

-感叹号(!(

-问号(?(

-双点(:(

警告,不确定这是否会导致问题,但段落之间有空格。

我想知道使用这个是否是一个好的开始:

<?php
if (!str_ends_with($text, ['.','!','?',':'])) {
//If the string does not ends with the above options
//This is where I struggle....what to do? How to count all the 
//characters from the last ['.','!','?',':']
}
?>

你知道怎么做吗?

你永远不可能做到100%的确定性,因为句子可以在中间包含d.o.t.s。但通常在停止符后面有一个空格,所以这可能会给我们一个足够好的机会来解析大多数句子。

$text = "But even though the universe is incredibly large, it's also expanding.
So it's actually getting bigger every day. Scientists believe that the universe started with a
big bang 13.8 billion years ago and has been expanding ever since. That means that the universe has 
been getting n.y.p.d bigger for an ip address of 12.32.43.21 very long time and";
$text = trim($text) . " ";
$arr = preg_split('/[.!?:] /', $text);
if ($arr[count($arr) - 1] !== '') {
$search = "!.?:";
$max = 0;
for ($i=0; $i<strlen($search); $i++) {
$sign = $search[$i] . " ";
$pos = strrpos($text, $sign);
if ($pos>$max) {
$max = $pos;
}
}
$text = substr($text, 0, $max + 1);
echo ($text);
}

输出:

But even though the universe is incredibly large, it's also expanding. So it's actually getting bigger every day. Scientists believe that the universe started with a big bang 13.8 billion years ago and has been expanding ever since.

我不希望这项任务在工作中落到我的桌子上。从长远来看,这注定会出乎意料地失败。英语太复杂了,仅靠正则表达式无法解析。现在,只需将所有内容匹配到最后出现的白名单字符,然后使用K释放匹配的字符。然后将之后的所有内容替换到字符串的末尾。

当最后一个句子以符合条件的标点符号结束时,就不会执行替换操作。

代码:(演示(

echo preg_replace(
'/.*[.!?:]K[^.!?:]+$/s',
'',
$text
);

为了澄清边缘大小写,当字符串中没有标点符号时,此模式不会将文本简化为空字符串。相反,这种模式至少需要一个标点符号,并且只在完成的句子之后删除未完成的句子。我认为你不太可能在实际项目中遇到这种情况,但这可能是我应该明确提及的事情。(演示(

如果要删除字符串末尾不包含标点符号的子字符串,则模式为/[^.!?:]+$/。这将破坏整个未加标点符号的文本。(演示(它仍然可以在您的原始样本字符串上按需工作。(演示(

最新更新