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

Php 拆分字符串,保留HTML标记和单词,php,Php,我需要从所见即所得(WYSIWYG)中获取一个输入,并将其分解为每行有33个(或大约)字符。如果它达到极限,我需要插入一个新行。以下是我的想法: for($i=0; $i < strlen($string); $i++) { if ($i % 33 == 0 && $i != 0) { $characters[] = '\r'; } $characters[] = $string[$i]; } $result = implode($characters

我需要从所见即所得(WYSIWYG)中获取一个输入,并将其分解为每行有33个(或大约)字符。如果它达到极限,我需要插入一个新行。以下是我的想法:

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

$result = implode($characters);
for($i=0;$i

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

我要做的是按空格展开,然后计算出一行中可以容纳的“单词”数,而不超过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
$words=explode(“”,$string);//将所有“单词”放在一个字符串中
$lines=array();//行列式
$line=array();//一行
对于($i=0;$i如果($new_line_length,我发现JavaScript实际上非常擅长这一点,因为您拥有DOM的强大功能。您可以问“这段tekst有多宽”,它考虑了单个字符的宽度

总体思路是:

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

  • 我怀疑Kevin想保留标记并只是减少内容。是的,标记需要保留。我需要在表单处理状态下这样做,这比使用JS对抗CKEditor更容易(在我看来),这似乎返回空白。在每次迭代中,$new_行都是空白的。