Php 将字符限制为特定宽度

Php 将字符限制为特定宽度,php,font-size,Php,Font Size,这个问题我已经碰到过好几次了。我可以将字符串中的字符限制为特定的数字。但是,有些字符比其他字符长,因此它会换行,或者使我的DIV元素更宽,并且与网站的其他部分不一致 例如: Literacy - Is it the Sa Machu Picchu, Cuzco, Pe 包括空格在内的字符数(23)完全相同,但就屏幕上的实际宽度而言,Machu Pichu的字符数更长 有没有办法根据实际字符串的宽度而不是字符数来确定字符串的统一大小?之前一定有人想出了解决办法,对吧 如果不使用PHP编写算法,根

这个问题我已经碰到过好几次了。我可以将字符串中的字符限制为特定的数字。但是,有些字符比其他字符长,因此它会换行,或者使我的DIV元素更宽,并且与网站的其他部分不一致

例如:

Literacy - Is it the Sa
Machu Picchu, Cuzco, Pe
包括空格在内的字符数(23)完全相同,但就屏幕上的实际宽度而言,Machu Pichu的字符数更长


有没有办法根据实际字符串的宽度而不是字符数来确定字符串的统一大小?之前一定有人想出了解决办法,对吧

如果不使用PHP编写算法,根据所使用的特定字体的“字体宽度”限制字符,则可以使用单空格字体


或者,我肯定也可以编写JavaScript解决方案来测试宽度,但我不确定我的想法有多离谱。

您可能需要使用GD和imagefontwidth():

这不能在PHP中完成——您所能做的最好是近似值。不同的浏览器和不同的操作系统为同一字体呈现不同的字体宽度。因此,即使您在浏览器和操作系统上手动存储字体的字符字体宽度数组,它也可能与其他字体不匹配

通常情况下,围绕不同宽度字体的可能性进行设计比试图强制使用字体要好

也就是说,这可以在javascript中完美地完成(无需近似),尽管需要一点技巧。有许多可能的方法,但这里有一种:首先在一个具有您要查找的宽度的div中呈现完整的字符串,然后测量div的高度。如果可能大于一行,则开始循环,逐步删除最后一个单词。继续前进,直到div的高度为一行。

  • 第一个(显而易见的)解决方案:切换到固定宽度字体,如Courier、Lucida Console、Console等
  • 第二种解决方案:使用测量工具来测量该对象

使用CSS进行格式化,这样它们的宽度都是一致的——右侧没有锯齿状边缘。大概是这样的:

p { text-align: justify; }

在这个CSS+JS解决方案上做了一些有趣的工作。它没有经过密集测试(Firefox+IE7/8),但应该可以正常工作

<script type="text/javascript" src="jquery.js"></script>
<style>
    .monospaced, .not-monospaced{
        font: normal normal 16px/16px Verdana; /* not monospaced font */
        clear: both;
    }
    .monospaced span{
        float: left;
        display: block;
        width: 16px;
        text-align: center;
    }
</style>
<script>
    $(document).ready(function(){
        $('.monospaced').each(function(){
            var monospace = $(this).html(); // .trim() does not work at IE http://api.jquery.com/jQuery.trim/ (view comments)
            monospace.replace(/(^[\s\xA0]+|[\s\xA0]+$)/g, '');
            mono = monospace.split('');

            for(i = 0; i < mono.length; i++){
                if(mono[i] == ' ')
                    mono[i] = '&nbsp;';

                mono[i] = '<span>'+mono[i]+'</span>';
            }

            $(this).html(mono.join(''));
        });
    });
</script>
</head>
<body>
    <div class="not-monospaced">
        This is supposed to be monospaced...
    </div>
    <div class="not-monospaced">
        mmmm mm mmmmmmmm mm mm mmmmmmmmmm...
    </div>

    <div class="monospaced">
        This is supposed to be monospaced...
    </div>
    <div class="monospaced">
        mmmm mm mmmmmmmm mm mm mmmmmmmmmm...
    </div>
</body>

.等距,.非等距{
字体:普通16px/16px Verdana;/*非等距字体*/
明确:两者皆有;
}
.单间距跨度{
浮动:左;
显示:块;
宽度:16px;
文本对齐:居中;
}
$(文档).ready(函数(){
$('.monospaced')。每个(函数(){
var monospace=$(this.html();//.trim()在IE上不起作用http://api.jquery.com/jQuery.trim/ (查看评论)
monospace.replace(/(^[\s\xA0]+|[\s\xA0]+$)/g',);
mono=单空间分割(“”);
对于(i=0;i
你可以使用单间距字体:你看到我的js+css解决方案了吗?@andre matos我现在正在看。感谢您的帮助注意,这将根据GD的字体呈现机制为您提供字符串的长度,并且可能与最终用户浏览器上的实际长度不匹配(即使它与您的匹配)——这是一种近似宽度的好方法,但不会给您准确的结果(准确的结果只能从javascript中获得——因为javascript在最终用户的浏览器上运行,它有关于它的完美信息).同意你的看法,@Ben Lee,这是一个近似的方法。只要试着保持在问题的范围内。使用JavaScript,我相信你需要做一些数学,以及给定DIV的CSS样式…需要一些思考,但这可能是可能的。不需要JS黑客,也不需要PHP!你只需要将JS和CSS结合起来,看看我的解决方案打开并让我知道您是否能发现任何问题。谢谢您的回答。我认为那里有固定宽度的字体。不幸的是,我的客户不喜欢它们。我将不得不探索GD库或javascript解决方案。