【问题标题】:Add space when a word is too long当单词太长时添加空格
【发布时间】:2013-03-10 19:47:42
【问题描述】:

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

$string = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";

然后我将这个字符串输出到一个 100 像素宽的容器中。如果任何单词超过 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

【问题讨论】:

  • 插入零宽度连接符。
  • 如果您打算在 HTML 中使用它,请查看 CSS word-wrap
  • 或者更复杂的方法是创建一个数组,如果一个项目的长度超过 10 个字符,则 chunk_split 它
  • 您是否只是想让长单词换行而不是延伸到其父元素之外?
  • @sachleen 完美解决方案。

标签: php string


【解决方案1】:

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

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

<p>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</p>

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

【讨论】:

  • 此解决方案的问题是您无法控制可能发生中断的位置。在这方面使用 &lt;wbr&gt; 或不可见的 unicode 空间会更好 - 你只在允许拆分的地方插入
  • 是的,这完全取决于您要完成的工作。
【解决方案2】:

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

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

另一种选择是

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

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

最好的选择是在句子的最后部分放置一个&lt;div&gt;

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      您可以使用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

      【讨论】:

        【解决方案5】:

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

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

        Demo

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

            另一种选择..

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-12-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-12-18
              • 2018-05-29
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多