Php 将文本一分为二,但在最接近的句子处

Php 将文本一分为二,但在最接近的句子处,php,html,string,Php,Html,String,$text变量示例: Lorem ipsum dolor sit amet,Concetetur Adipising Elite,sed do 临时性的劳动和生产许可证。乌特埃尼姆酒店 最低成本、最低成本和最低成本 我是一个普通的消费者。两个人在一起吗 这是一个充满活力的故事 帕里图尔。除非圣奥卡塔特无过失,必须 这是我的错 一分为二: $half = strlen($text) / 2; 将使我找到consequat中的o字符 如何在文本中间找到最近句子定界符(DOT)的位置?在本例中,它的

$text
变量示例:

Lorem ipsum dolor sit amet,Concetetur Adipising Elite,sed do 临时性的劳动和生产许可证。乌特埃尼姆酒店 最低成本、最低成本和最低成本 我是一个普通的消费者。两个人在一起吗 这是一个充满活力的故事 帕里图尔。除非圣奥卡塔特无过失,必须 这是我的错

一分为二:

$half = strlen($text) / 2;
将使我找到
consequat
中的
o
字符

如何在文本中间找到最近句子定界符(DOT)的位置?在本例中,它的后面是7个字符
o

此文本还包含HTML代码。
我想在查找文本的半点时忽略HTML,并忽略HTML属性中的点等。

看一下,然后。在
strpos
的帮助下,您可以找到下一个点的位置,并使用strip_标记从字符串中删除所有html标记

$string = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborumt.';
$string = strip_tags($string);
$half = intval(strlen($string)/2);
echo substr($string, 0, strpos($string, '.', $half)+1);
考虑到您必须确保在
$half
值之后存在一个点,否则输出将不是您想要的

也许是这样的

if (strpos($string, '.', $half) !== false)
    echo substr($string, 0, strpos($string, '.', $half)+1);
else
    echo substr($string, 0, $half) . '...';

假设您的句子可以以句号以外的其他字符结尾,您可以查看以下内容:

$s = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.';

// find center (rounded down)
$mid = floor(strlen($s) / 2);
// find range of characters from center that are not ?, ! or .
$r = strcspn($s, '.!?', $mid);

// remember to include the punctuation character
echo substr($s, 0, $mid + $r + 1);
你可能需要稍微调整一下,但它应该做得很好。对于更高级的内容,您正在踏入NLP(自然语言处理)领域,PHP中也有可用的库:

函数abbrevia($str,$maxChars){$limit=$maxChars;

如果(strlen($str)从概念上你清楚地知道需要做什么。我看不出问题所在-你尝试了什么,为什么不起作用?如果下一个点不是句子的结尾,例如,给出了一个例子,怎么办?那么我想它仍然会被认为是句子的结尾。我不知道有什么办法:)
function abbrevia($str, $maxChars) {    $limit=$maxChars;
    if (strlen($str)<=$maxChars) return $str;
    else while ($str[$limit]!=" " && $str[$limit]!="." && $str[$limit]!=";" && $str[$limit]!="," && $str[$limit]!="!" && $str[$limit]) $limit++;
    return substr($str,0,($limit))."...";
}