缩短文本块中的单词

时间:2010-03-15 09:48:53

标签: php text

我有一个文本块偶尔有一个很长的单词/网址,它突破了我网站的布局。

通过这段文字并缩短字词的最佳方法是什么?

示例:

这是一些文字,这个长词就像这样

fkdfjdksodifjdisosdidjsosdifosdfiosdfoisjdfoijsdfoijsdfoijsdfoijsdfoijsdfoisjdfoisdjfoisdfjosdifjosdifjosdifjosdifjosdifjsodifjosdifjosidjfosdifjsdoiofsij and i need that to either wrap in ALL browsers or trim the word.

6 个答案:

答案 0 :(得分:1)

我想你需要 wordwrap 功能。

答案 1 :(得分:1)

你可以truncate the string所以它在字符串的中间或末尾出现省略号。但是,这将独立于webbrowser中的实际呈现。在浏览器中呈现时,PHP无法确定字符串与特定字体的实际长度,尤其是如果您已定义了后备字体并且不知道浏览器中使用了哪种字体,例如。

font-family: Verdana, Arial, sans-serif;

比较以下内容:

我是23个字符长 I am 23 characters long

两个字符都具有相同的长度,但由于一个字符是单一类型而另一个不是实际宽度,因此它具有不同的长度。 PHP无法确定这一点。您必须找到客户端技术probably JavaScript,才能为您解决此问题。

您还可以使用CSS property overflow:hidden将文本换行到元素中,以使文本在固定长度后消失。

环顾四周。我很确定这个问题不止一次被问过。

答案 2 :(得分:1)

function fixlongwords($string) {

$exploded = explode(' ', $string);
$result = '';
foreach($exploded as $curr) {
    if(strlen($curr) > 20) {
    $curr = wordwrap($curr, 20, '<br/>\n');
}
    $result .= $curr.' ';
}

return $result;

}

这应该可以胜任。

答案 3 :(得分:1)

您可以使用word-wrap: break-word CSS属性来包装破坏布局的文本。

查看证明其用途的the Mozilla Developer Center examples

答案 4 :(得分:0)

你可以这样做:

preg_replace("/(\\S{20})/", '$1&zwnj;', $text);

它应该*在每20个字符的所有单词中添加零宽度非连接字符。这意味着他们将自行换行。

*(未经测试)

答案 5 :(得分:0)

根据@ JonnyLitt的回答,这是我对这个问题的看法:

<?php

function insertSoftBreak($string, $interval=20, $breakChr='&shy;') {
    $splitString = explode(' ', $string);
    foreach($splitString as $key => $val) {
        if(strlen($val)>$interval) {
            $splitString[$key] = wordwrap($val, $interval, $breakChr, true);
        }
    }
    return implode(' ', $splitString);
}

$string = 'Hello, My name is fwwfdfhhhfhhhfrhgrhffwfweronwefbwuecfbryhfbqpibcqpbfefpibcyhpihbasdcbiasdfayifvbpbfawfgawg, because that is my name.';
echo insertSoftBreak($string);

?>

以空格分隔的值打破字符串,检查每个单词“单词”的长度(单词包括点,逗号或问号等符号)。对于每个单词,检查长度是否超过$interval个字符,如果是,请在每个&shy;个字符处插入$interval(软连字符)。

我选择了软连字符,因为它们似乎在浏览器中得到了相对较好的支持,除非该字实际包含在该位置,否则它们通常不显示。

我不知道可以使用的任何其他可用(且受到良好支持的)HTML实体(&zwnj;似乎在FF 3.6中似乎不起作用,至少如此),所以如果对{{{{{ 1}}缺乏,纯CSS或基于Javascript的解决方案将是最好的。