2011-07-06 69 views
4

我有一个显示多个文本条目的网页,这些条目的长度没有限制。如果它们太长以至于无法避开新线路,它们会自动切断。这是削减它们的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属性文本-overflow:省略号,因为它没有得到广泛的支持,它不允许我使“...”点击能够链接到完整的条目,并且我不惜一切代价需要这个)。

在此先感谢。

+0

你在做什么并不是最佳实践...... PHP不知道UI的任何内容以及它是如何设计的,这就是为什么它不能计算最佳文本宽度......使用CSS/Javascript。添加“查看更多”链接是另一个与您的问题无关的故事。 –

+0

另请注意,您似乎正在处理UTF-8代码,并且没有任何适当的位置来避免在中间代码点中切断字符串。实际上,想一想:通过结合字符,这样的任务在一般意义上肯定是不平凡的。 –

回答

1

如果您的应用程序的风格不是太重要,那么您可以简单地在等宽系列中使用字体,例如Courier。

+0

由于OP正在经历所有麻烦以正确对齐事物,因此我'那种猜测那种风格*很重要... –

3

您可以使用固定宽度的字体,以便所有字符的宽度均相等。或者可以选择得到每个字符有多少像素,并将它们加在一起,并删除附加字符,而不是像素长度超过一定量。

+0

你的第二个选择是有问题的。浏览器之间有区别,它可能会导致错误。 –

+0

@Garbriele:这就是**正是**你不应该试图在服务器端做这件事的原因:你要么*过份关注*(即在许多情况下切断多于必要)或与事实上,一些文本仍然会溢出。 –

+0

我最终发现使用等宽字体是最好的解决方案。由于这个页面必须与旧浏览器完全兼容,并且javascript已禁用,所以我将使用等宽字体作为后备,并使用jQuery替换它(如果可用) –

1

用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; 
    } 
} 
+0

我只能使用PHP,对不起。 –

+0

你有特定的原因为什么?考虑到手头的任务和可用的技术,这似乎是一个奇怪的限制。 – tskuzzy

+0

这是因为这个网站将被许多客户使用,而且很有可能运行旧浏览器或禁用JavaScript。 –

-2

因为你所要求的网页,那么你可以使用CSS文本溢出来做到这一点。 这似乎是足够的支持,并为Firefox似乎有css workaroundsjquery workarounds ...

事情是这样的:

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

如果您填写更多的文字比它符合这将增加三个点最后。 只要剪切文本,如果它真的太长,所以你不会浪费html空间。

此处了解详情:

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

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

+0

对不起,在我指定的问题中,我无法使用该方法,也无法使用JavaScript解决方法。 –

+0

对不起,你必须反驳黑客:) –