单词太长时添加空格

时间:2013-03-10 19:47:42

标签: php string

我的问题如下。我有一个这样的字符串:

$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

7 个答案:

答案 0 :(得分:2)

如果您打算在HTML中查看此内容,请尝试添加<wbr/>而不是空格

答案 1 :(得分: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。< / p>

答案 2 :(得分:2)

使用wordwrap() Wordwrap在完成单词之前剪切句子以达到最大宽度。在下一个例子中,我转动了true最后一个参数,强制剪切总是有10个字符。

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

另一种选择是

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

然而,按字符数减少并不安全,因为字母的宽度并不总是相同(不同的字体类型)

最好的选择是在句子的最后部分放置一个<div>

答案 3 :(得分:2)

如果你只是想强制你的字符串换行而不是扩展到它的父元素之外,你可以直接在css中完成它而不必乱用你的字符串:

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

<p>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</p>

这将让浏览器弄清楚它需要打破的地方,而不是你试图在服务器上解决它。

答案 4 :(得分:1)

如果您打算在HTML中使用此功能,请查看CSS word-wrap

#foo { 
  width: 100px;
  word-wrap: break-word;
}

Demo

答案 5 :(得分:0)

我认为重点是让这些“单词”不会破坏你的布局。看到这样的“单词”多长时间甚至可能不是单词,将它们分开也不太可能使它们更具可读性......为什么不将它们删除呢?

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

答案 6 :(得分:0)

另一种选择..

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