2013-03-10 41 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);