将文本分成两半,但在最近的句子

Posted

技术标签:

【中文标题】将文本分成两半,但在最近的句子【英文标题】:Split text in half, but at the nearest sentence 【发布时间】:2012-05-16 12:54:49 【问题描述】:

$text 变量示例:

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua。 Ut enim 广告 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 偏执。 Exceptioneur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est labourum。

一分为二:

$half = strlen($text) / 2;

会让我找到consequat 中的o 字符。

如何在文本中间找到最近的句子分隔符(点)的位置?在此示例中,它是 o 之后的 7 个字符。

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

【问题讨论】:

显然您从概念上知道需要做什么。我没有发现问题 - 您尝试了哪些方法,为什么没有成功? 如果下一个点不是句尾,例如:举个例子? 那么我想它仍然会被认为是句末。我不知道有什么办法:) 【参考方案1】:

看看substr、strip_tags 和strpos。在strpos 的帮助下,您可以找到下一个点的位置,并使用 strip_tags 从字符串中剥离所有 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) . '...';

【讨论】:

【参考方案2】:

假设你的句子可以以句号以外的其他字符结尾,你可以看看这个:

$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 中也有可用的库:

http://sourceforge.net/projects/nlp/

【讨论】:

【参考方案3】:
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))."...";

你可以修改这个函数

【讨论】:

以上是关于将文本分成两半,但在最近的句子的主要内容,如果未能解决你的问题,请参考以下文章

将文本拆分为句子

阅读文字段落。文件,拆分成句子,并打印到新文本。 c#中的文件

使用正则表达式将字符串拆分为句子

将文本文档的内容分门别类,查看部分文本

将屏幕分成两半并将图像视图放在两半的两半上

Haskell 新手将列表分成两半的麻烦