4

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

$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
4

7 回答 7

5

如果您只是想强制您的字符串换行而不是延伸到其父元素之外,您可以直接在 css 中执行此操作,而不必弄乱您的字符串:

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

<p>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</p>

这会让浏览器找出它需要中断的地方,而不是你试图在服务器上找出它。

于 2013-03-10T19:57:00.703 回答
3

使用wordwrap() Wordwrap 将句子前面的完整单词切割成最大宽度。在下一个示例中,我将true最后一个参数设为强制剪切始终使用 10 个字符。

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

另一种选择是

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

但是按字符数切割并不安全,因为字符的宽度并不总是相同(不同的字体类型)

最好的选择是将a<div>放在句子的最后部分。

于 2013-03-10T19:55:54.987 回答
2

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

于 2013-03-10T19:53:23.367 回答
2

你可以用preg_replace()做到这一点:

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

这将在每个连续的 10 个非空格字符 ( \S) 块之后插入一个空格,然后至少再添加一个非空格。

此外,您可能更愿意插入软连字符U+00AD 或 Unicode零宽度空格U+200B ,而不是常规空格。


编辑:正如 sachleen 和其他人所指出的,实际问题的最佳解决方案可能是CSS word-wrap 属性,特别是word-wrap: break-word.

于 2013-03-10T19:53:27.243 回答
1

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

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

演示

于 2013-03-10T20:00:49.817 回答
0

我认为重点是使这些“单词”不会破坏您的布局。看到像这样的“单词”有多长可能甚至不是单词,并且将它们拆分不太可能使它们更具可读性......为什么不直接删除它们呢?

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

于 2013-03-10T19:52:50.587 回答
0

另一种选择..

$string = preg_replace_callback(
  "~\w{11,}~",
  create_function(
    '$m',
    'return chunk_split($m[0],10," ");'
  ),
  $string);
于 2013-03-10T20:10:08.353 回答