拆分字符串,保留HTML标记和单词

时间:2011-12-19 22:41:34

标签: php

我需要从WYSIWYG获取输入并将其分解为每行有33个(或近似)字符。如果达到极限,我需要插入一个新行。以下是我提出的建议:

for($i=0; $i < strlen($string); $i++) {
  if ($i % 33 == 0 && $i != 0) {
    $characters[] = '\r';
  }
  $characters[] = $string[$i];
}

$result = implode($characters);

这会破坏HTML标记和单词。我需要忽略HTML标记,并允许在断行之前完成单词。有什么更好的方法来实现这一目标?

2 个答案:

答案 0 :(得分:1)

我要做的是按空间爆炸,然后找出可以放在一行上的“单词”数量,而不超过33个字符。

 $words = explode(' ', $string); // Get all the "words" into one string
 $lines = array(); // Array of the lines
 $line = array(); // One line
 for ($i = 0; $i < count($words); $i++) {
     $new_line = array_merge($line, $words[$i]); // Previous line plus this word
     $new_line_length = strlen(strip_tags(implode(' ', $new_line))); // Length of line
     if ($new_line_length <= 33) { // Is this line under 33 characters?
         $line[] = $words[$i];  // Yes, let's add this word to the line
     } else { // No, too long.
         $line[] = "\r";  // Add newline
         $lines[] = $line; // Add $line to the $lines array
         $line = array(); // Reset the line
     }
 }
 $final_string = implode('', $lines); // Put the whole thing back into one string

我刚刚在这里做过这个并没有测试过,但这是基本的一般想法。希望能帮助到你。祝好运。 :)

编辑:将strip_tags()添加到长度检查中,这样标签就不会影响线的长度(因为它们无论如何都是不可见的)

答案 1 :(得分:0)

我发现JavaScript实际上非常擅长这一点,因为你可以使用DOM的强大功能。你可以问“这件tekst有多宽”,它考虑了单个字符的宽度。

总体思路是:

  1. 将您的DOM片段从根遍历到叶子。
  2. 为每个节点确定它是块级元素(如div)还是内联元素(如spana)。对于块级元素:假设它们将从新行开始并以新行结束,因此请相应地重置计数器。
  3. 继续将字符(或单词)添加到某个不可见的div中,该div具有与wysiwyg相同的字体属性并查询宽度。如果宽度超过设定的数量,请插入换行符。