我需要从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标记,并允许在断行之前完成单词。有什么更好的方法来实现这一目标?
答案 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有多宽”,它考虑了单个字符的宽度。
总体思路是:
div
)还是内联元素(如span
或a
)。对于块级元素:假设它们将从新行开始并以新行结束,因此请相应地重置计数器。