【问题标题】:Issue with algorithm to shorten sentences缩短句子的算法问题
【发布时间】:2011-09-29 13:41:16
【问题描述】:

我有一个网页,它显示多个文本条目,它们的长度没有限制。如果它们太长而无法避免进入新生产线,它们会被自动剪切。这是剪切它们的 PHP 函数:

function cutSentence($sentence, $maxlen = 16) {
    $result = trim(substr($sentence, 0, $maxlen));

    $resultarr = array(
            'result' => $result,
            'islong' => (strlen($sentence) > $maxlen) ? true : false    
        );

    return $resultarr;
}

如下图所示,结果很好,但也有一些例外。包含多个 Ms 的字符串(我必须考虑这些)将转到换行符。

现在所有字符串都在 16 个字符后被删减,这已经非常低并且难以阅读。

我想知道是否存在一种方法来确保应该获得更多空格的句子得到它,并且那些包含宽字符的句子最终被削减为更少的字符(请不要建议使用 CSS 属性 text-溢出:省略号,因为它没有得到广泛的支持,它不允许我点击“...”链接到完整的条目,我不惜一切代价需要这个)。

提前致谢。

【问题讨论】:

  • 您所做的不是最佳实践... PHP 对 UI 及其样式一无所知,这就是为什么它无法计算最佳文本宽度... 使用 CSS / Javascript .添加“查看更多”链接是另一个与您的问题无关的故事。
  • 另请注意,您似乎正在处理 UTF-8 代码,并且没有任何东西可以避免在代码点中间剪切字符串。实际上,想想看:组合字符这样的任务绝对在一般意义上是不平凡的。

标签: algorithm ellipsis


【解决方案1】:

既然你要求一个网页,那么你可以使用 CSS text-overflow 来做到这一点。 好像支持够了,firefox好像有css workarounds或者jquery workarounds...

类似这样的:

span.ellipsis {
   white-space:nowrap;
   text-overflow:ellipsis;
   overflow:hidden;
   width:100%;
   display:block;
}

如果您填写的文本多于其大小,则会在末尾添加三个点。 如果文本实在太长,就剪掉文本,以免浪费 html 空间。

更多信息在这里:

https://developer.mozilla.org/En/CSS/Text-overflow

在末尾添加一个“查看更多”链接很容易,因为附加另一个固定宽度的跨度,包含查看更多链接。在此之前,文本将被省略号截断。

【讨论】:

  • 抱歉,在我指定的问题中,我无法使用该问题,也无法使用 javascript 解决方法。
  • 对不起,你必须重新开始 hack :)
【解决方案2】:

使用 Javascript 而不是 PHP。使用 DOM 属性 offsetWidth 获取包含元素的宽度。如果超过某个最大宽度,则相应地截断。

How can I mimic text-overflow: ellipsis in Firefox?复制的代码:

function addOverflowEllipsis( containerElement, maxWidth )
{
    var contents = containerElement.innerHTML;
    var pixelWidth = containerElement.offsetWidth;
    if(pixelWidth > maxWidth)
    {
        contents = contents + "…"; // ellipsis character, not "..." but "…"
    }
    while(pixelWidth > maxWidth)
    {
        contents = contents.substring(0,(contents.length - 2)) + "…";
        containerElement.innerHTML = contents;
        pixelWidth = containerElement.offsetWidth;
    }
}

【讨论】:

  • 我只能使用 PHP,对不起。
  • 您有具体的原因吗?考虑到手头的任务和可用的技术,这似乎是一个奇怪的限制。
  • 这是因为这个网站将被许多客户使用,很有可能运行旧浏览器或禁用 javascript。
  • 从您发布的图片来看,您似乎正在设计某种 Web 2.0 应用程序,并且自然而然地假设存在 Javascript。
【解决方案3】:

如果您的应用程序的样式不太重要,您可以简单地使用等宽字体系列中的字体,例如 Courier。

【讨论】:

  • 由于 OP 正在经历所有的麻烦以使事情恰到好处,我猜想风格 很重要......
【解决方案4】:

您可以使用固定宽度的字体,这样所有字符的宽度都相等。或者可选地获取每个字符的宽度像素并将它们加在一起并删除额外的字符,而不是像素长度超过一定数量。

【讨论】:

  • 您的第二个选项有问题。浏览器之间存在差异,可能会导致错误。
  • @Garbriele: 正是您不应该尝试在服务器端执行此操作的原因:您要么需要过度小心 (即在许多情况下,剪掉多余的部分)或忍受某些文本仍会溢出的事实。
  • 我最终发现使用等宽字体是最好的解决方案。由于此页面必须在旧浏览器和禁用 javascript 的情况下完美运行,我将只使用等宽字体作为后备,并在可用时使用 jQuery 替换它
猜你喜欢
  • 2011-06-02
  • 2021-11-10
  • 2015-03-01
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
相关资源
最近更新 更多