如何将字符串缩短以便它不会转到div标签的下一行例如我的message
字符串包含以下内容:
我们更喜欢可以回答的问题,而不仅仅是讨论过。提供细节。写得清楚简单。如果您的问题与本网站有关,请在meta上询问。
我希望最好将其显示为
我们更喜欢可以回答的问题,而不仅仅是讨论过。提供...阅读更多
我想用PHP来缩短字符串,但是你有以下问题
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ...阅读更多
您可以看到上面的字符串仍然可以扩展一点。任何方式做到这一点或不做,谢谢你提前
答案 0 :(得分:4)
如何缩短字符串已经得到解答,但您的主要问题是:
如何切割字符串短所以它不会转到div标签的下一行
这在大多数情况下都不起作用。
例如:
IIIIIIIIII
wwwwwwwwww
你看到了问题吗?
这只适用于你的字符宽度相同的情况:
iiiiiiiiii
wwwwwwwwww
答案 1 :(得分:4)
使用PHP,您可以使用wordwrap
函数执行截断:
function truncate_to_length($text, $length, $text_if_longer = "...")
{
if (strlen($text) > $length)
{
$text = wordwrap($text, $length);
$text = substr($text, 0, strpos($text, "\n"));
return $text . $text_if_longer;
}
return $text;
}
答案 2 :(得分:1)
检查尺寸,如果尺寸大于最大尺寸,请取最左边的字符。
最左边#=总大小 - 大小(“...阅读更多”)。 然后将读取更多地附加到最左边的字符。
雅各
答案 3 :(得分:1)
以下是http://snippetdb.com/php/truncate-string:
的示例function Truncate ($str, $length=10, $trailing='...') { // take off chars for the trailing $length-=strlen($trailing); if (strlen($str) > $length) { // string exceeded length, truncate and add trailing dots return substr($str,0,$length).$trailing; } else { // string was already short enough, return the string $res = $str; } return $res; }
答案 4 :(得分:1)
Oooo我想出了一些有效但不完全有用的东西...我想分享
div.string{
height:15px;
overflow:hidden;
}
它解决了它将隐藏整个单词的问题,因为溢出和高度仅设置为一行。然而,上述仍然是Rufinus所显示的问题:
iiiiiiiiiiiiii
wwwwwwwwwwwwww
答案 5 :(得分:1)
以下主要是有效的;主要问题是“...阅读更多”通知可以掩盖部分信件。它还使用了一堆表示元素,需要JS。这让我觉得不洁净。
最外层元素(类.string)用于设置整体大小。 .text保存要显示的文本。后代层次结构中的.string和.text之间是宽度较大的元素。这将.text中的所有文本放在一行上。 JS用于显示或隐藏“...阅读更多”通知。
<style type="text/css">
.string {
height: 1em;
width: 25%;
position: relative; /* create containing block for children */
border: 1px solid black;
overflow: hidden;
background: white; /* or whatever, as long as it's not "transparent". */
}
.string .line {
width: 5000px; /* long enough for you? */
}
.string .notice {
position: absolute;
top: 0;
right: 0;
z-index: 1;
display: none;
background: inherit; /* so that the notice will completely cover up whatever's beneath */
}
</style>
<div class="string">
<div class="line"><span class="text">We prefer questions that can be answered,
not just discussed. Provide details. Write clearly and simply. If your
question is about this website, ask it on meta instead.</span></div>
</div>
<hr />
<div class="string">
<div class="line"><span class="text">Lorem ipsum dolor sit amet.</span></div>
</div>
<script>
function isOverflowed(elt) {
return elt.offsetWidth > elt.parentNode.parentNode.clientWidth;
}
function getNotice(textElt) {
try {
return (textElt.parentNode.parentNode.getElementsByClassName('notice'))[0];
} catch (e) {
return {style: {}};
}
}
function show(elt) {
elt.style.display = 'block';
}
function hide(elt) {
elt.style.display = 'none';
}
function showReadMoreNotices() {
var text=document.getElementsByClassName('text');
for (var i=0; i<text.length; ++i) {
if (isOverflowed(text[i])) {
show(getNotice(text[i]));
} else {
hide(getNotice(text[i]));
}
}
}
var strings = document.getElementsByClassName('string');
var notice = document.createElement('div');
notice.appendChild(document.createTextNode('\u2026Read more'));
notice.className = 'notice';
for (var i=0; i<strings.length; ++i) {
strings[i].appendChild(notice.cloneNode(true));
}
showReadMoreNotices();
/* use your favorite event registration method here. Not that the traditional
* model is my favorite, it's just simple.
*/
window.onresize = showReadMoreNotices;
</script>
答案 6 :(得分:1)
这是一个从智能模板中挑选出来的功能,它可以在不削减字符串的情况下缩短字符串。
function str_short($string, $length = 80, $etc = '...',
$break_words = false, $middle = false)
{
if ($length == 0)
return '';
if (strlen($string) > $length) {
$length -= min($length, strlen($etc));
if (!$break_words && !$middle) {
$string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length+1));
}
if(!$middle) {
return substr($string, 0, $length) . $etc;
} else {
return substr($string, 0, $length/2) . $etc . substr($string, -$length/2);
}
} else {
return $string;
}
}
答案 7 :(得分:0)
这一切都取决于字体。当然,您可以使用等宽字体,但这不是解决方案。无论如何,你为什么要这样做?即使您设法使其适用于某种字体,也可能是用户没有它。然后会使用不同的字体,一切都可能会破坏......
答案 8 :(得分:0)
使用非等宽字体在PHP中基本上不可能这样做(即使使用等宽字体,很难准确判断字符串在某个浏览器中的长度。我能想到的唯一方法在浏览器中执行此操作是将其放入a并将span的宽度设置为某个宽度,然后使用overflow:hidden。
答案 9 :(得分:0)
如果您知道浏览器使用的真实字体,可以使用GD库中的imagettfbbox()来计算文本的宽度。然后迭代并删除文本末尾的字符,直到它适合您的div。
这可能不是非常有效,我知道,但它确实起作用。您可以针对特定解决方案进行微调和优化。
<?
$width = 280; // max. width in pixels that the text should have
$font = 'C:\Windows\Fonts\verdana.TTF';
$text = 'The quick brown fox jumps over the lazy dog';
function getWidth($text) {
list($x1, , $x2) = imagettfbbox(12, 0, $font, $text);
return $x2-$x1;
}
while (getWidth($text.'...') > $width) $text = substr($text, 0, -1);
?>
<style type='text/css'>
#my_div {
font-family: Verdana;
font-size: 12pt;
border: 1px solid black;
width: 280px;
padding: 0
}
</style>
<div id='my_div'>
<?=$text?>...
</div>
答案 10 :(得分:0)
根据您使用的浏览器,这一行CSS可以解决问题:
div.string {
word-wrap: break-word;
}