2013-03-10 40 views
2

我的問題如下。我有這樣的一個字符串:當單詞太長時添加空格

$string = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; 

和我輸出這個字符串在100px寬的容器中。如果任何單詞超過10個字符,有什麼方法可以在10個字符後自動插入空格?

$string = chunk_split($string, 10); 

不是一個好的解決方案,因爲它在一個詞的中間插入一個空格。例如:

$string = "This is why chunk_split doesn't work"; 
$string = chunk_split($string, 10); 
echo $string; 
// OUTPUT: This is wh y chunk_sp lit doesn' t work 

問題是空格字符允許字符串創建一個新行。


所需的輸出:

$string = "This is how it should work."; 
$string = function_i_am_looking_for($string); 
echo $string; 
// OUTPUT: This is how it should work. 


$string = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; 
$string = function_i_am_looking_for($string); 
echo $string; 
// OUTPUT: AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA 
+2

插入零寬度加入者。 – Wrikken 2013-03-10 19:51:33

+5

如果你打算在HTML中使用它,請看[CSS word-wrap](https://developer.mozilla.org/en-US/docs/CSS/word-wrap) – sachleen 2013-03-10 19:54:59

+0

或者更復雜的方式創建一個數組,如果一個項目超過10個字符長,chunk_split它 – cbarg 2013-03-10 19:55:27

回答

2

如果你只是希望強迫你的字符串來包裝,而不是擴大它的父元素之外,你可以直接做在CSS,並與您的字符串都沒有亂:

p { 
    width: 100px; 
    word-wrap: break-word; 
} 

<p>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</p> 

這將讓瀏覽器找出它需要中斷的地方,而不是你試圖在服務器上找出它。

+0

此解決方案的問題在於,您無法控制可能發生中斷的情況。在這方面使用''或隱形unicode空間更好 - 只允許在允許拆分的地方插入 – mvp 2013-03-10 20:01:55

+0

是的,這完全取決於您要完成的任務。 – ultranaut 2013-03-10 20:04:13

0

我認爲關鍵是讓這些 「字」 不破壞你的佈局。看到這樣的「單詞」有多久可能甚至不是單詞,並且分解它們不可能使它們變得更可讀......爲什麼不把它們移除呢?

$content = preg_replace("~\w{11,}~","",$content);

2

嘗試增加<wbr/>,而不是一個空間,如果你在HTML查看此刨

2

您可以用preg_replace()做到這一點:

$string = preg_replace('/(\S{10})(?=\S)/', '$1 ', $string); 

後這將插入一個空間每個連續的10個非空格字符塊(\S),後面至少有一個非空格字符。

另外,您可能更喜歡使用soft hyphen,U + 00AD或Unicode zero-width space,U + 200B來代替常規空格。


編輯:作爲sachleen和其他人指出,在實際問題的最佳解決方案可能是CSS word-wrap property,特別是word-wrap: break-word

2

使用wordwrap() Wordwrap在達到最大寬度之前用整個單詞剪切該句子。在下一個示例中,我將true作爲最後一個參數,強制剪切總是使用10個字符。

$short = wordwrap($string, 10, PHP_EOL, true); 

另一種選擇是

$short = wordwrap($string, 10, '<br>', true); 

然而由字符數削減不是安全的,因爲並不總是字符的寬度是相同的(不同的字體類型)

最好的選擇是在句子的最後部分放置一個<div>

0

另一種選擇..

$string = preg_replace_callback(
    "~\w{11,}~", 
    create_function(
    '$m', 
    'return chunk_split($m[0],10," ");' 
), 
    $string);