2011-12-19 108 views
0

我需要從所見即所得獲取輸入並將其分解爲每行具有33個(或近似)字符。如果它達到極限,我需要插入一條新線。這是我想出的:分割字符串,保留HTML標記和單詞

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

$result = implode($characters); 

這打破了HTML標籤和單詞。我需要忽略HTML標記,並允許單詞在打破行之前完成。什麼是更好的方法來實現這一目標?

+0

您不能使用strip_tags? – 2011-12-19 22:43:56

+0

我懷疑凱文想**保留標記**,只是減少內容。 – Quentin 2011-12-19 22:53:39

+0

是的,標記需要保留。 – Kevin 2011-12-20 13:41:05

回答

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()來長檢查,以便標籤不會影響線的長度(因爲他們是無論如何不可見的)

+0

這似乎返回空白。 $ new_line在每次迭代中都是空白的。 – Kevin 2011-12-20 15:02:58

0

我發現JavaScript的其實很擅長這是因爲你擁有DOM的力量。你可以問「這個tekst有多寬」,它考慮到個別字符寬度。

的總體思路是:

  1. 遍歷從根到葉的DOM片段。
  2. 對於每個節點,確定它是否是塊級元素(如div)或內聯元素(如spana)。對於塊級元素:假設它們將從新行開始並以新行結束,因此重置計數器。
  3. 不斷添加字符(或字)到一些不可見的div,它具有與wysiwyg相同的字體屬性並查詢寬度。如果寬度超過您的設定量,請插入換行符。
+0

我需要在表單處理狀態下這樣做,這比使用JS對CKEditor更容易(在我看來) – Kevin 2011-12-20 13:56:33