2012-02-06 72 views
0

我正在嘗試對齊電子郵件的基於文本的項目列表。基本上我遇到的問題是它僅適用於固定寬度(等寬字體)的字體 - 我想要一個基於標準Arialish字體中每個字母寬度的腳本。基於寬度的字母與sprintf對齊

function sprintf_nbsp() { 
    $args = func_get_args(); 
    return str_replace(' ', ' ', vsprintf(array_shift($args), array_values($args))); 
} 
$format = '%-6s%-\'.35.35s...%\'.10s<br>'; 
$str = sprintf_nbsp($format, '1', 'A list of items - this is the first', '$49.99'); 
$str .= sprintf_nbsp($format, '100', 'This is something else', '$4.99'); 
$str .= sprintf_nbsp($format, '5', 'A book', '$499.99'); 
$str .= sprintf_nbsp($format, '16', 'Testing the function', '$49.99'); 
echo '<div style="font-family:Courier">'.$str."</div>"; 
echo '<br><br>'.$str; 

(在sprintf_nbsp()可能沒有必要,我只是發現它的PHP論壇,我接受其他解決方案)

+0

因爲無法確定PHP中每個字母的寬度,所以您無法在PHP中執行此操作 - 您需要使用CSS樣式或等寬字體來實現所需的輸出。 – nickb 2012-02-06 20:28:50

+0

那麼你會如何建議我處理這個問題? – 2012-02-06 20:59:32

回答

3

固定寬度(等寬)的字體 - 我d就像一個腳本,它可以根據標準Arialish 字體中的每個字母的寬度以某種方式對齊它 。

簡而言之,這是不可能的。

With a fixed -width字體每個字符都有相同的寬度,因此名稱,固定寬度。

對於其他字體,情況並非如此。例如,您可以清楚地看到iM窄得多。

即使您指定了類似font-family: Arial之類的東西,您也無法知道用戶使用哪種字體,但這可能無法正常工作,不同的系統(OSX,X11等)使用不同的字體,而且某些用戶也會覆蓋字體網站的設置等

甚至如果你知道100%確定用戶使用哪種字體,那麼幾乎不可能將所有對象都對齊成像素完美。

所以,你有兩個選擇:要麼使用固定寬度的字體(「Consolas」是一個標準的Windows字體,看起來相當不錯),要麼使用不同的佈局。

你可能需要的是這樣的:無論

<style> 
    span { display: block; width: 20em;} 
</style> 

<span>Some text</span> 
<span>Hello, world!</span> 
<span>A swallow could not carry a coconut</span> 

在這裏,每<span>是相同的寬度(20em)文本含有量。

使用空格排列東西幾乎是總是一個壞主意。使用CSS不僅更簡潔,而且更容易。