2015-04-06 26 views
0

我正在尋找將單行換行符替換爲<br>標籤,但是只能在上下文中允許時使用。只有在上下文允許的情況下用html換行符替換單行換行

例如,考慮以下:

<ul> 
    <li>cat</li> 
    <li>dog</li> 
    <li>fish</li> 
    <li>horse</li> 
</ul> 

<br>標籤允許許多在上面的代碼中的區域,但在運行通常簡單替換/另外的代碼,例如使用nl2br()或跑步一個str_replace()顯然不會遵循這些上下文規則。

對於上面你需要遵循以下規則:

  • 換行符開始列表標籤應該轉換
  • 換行符開始列表標籤不應轉換
  • 換行符開始列表項標籤不應轉換
  • 換行符開始列表項標籤應該轉換
  • 換行符關閉列表項目標記應該需要轉換
  • b行reaks 收盤列表項標籤不應轉換
  • 換行符關閉列表標籤不應轉換
  • 換行符閉幕列表標記應該需要轉換

是否有當前可以執行此功能的函數/庫?當然這是一個普遍的問題,所以我想必須有一些東西。

+0

由於風險聽起來粗魯,我認爲'nl2br'不能用於HTML字符串。您應該使用HTML(新行字符不相關)或普通舊字符串(您可以自由地用'
'替換新行)。 你是否有機會在用戶提供的一些輸入上運行這個輸入,它可能包含或不包含HTML? – Grampa 2015-04-06 08:37:48

+0

@Grampa它實際上將運行在HTML上,它已經從用戶輸入的'bbcode'解析出來。我正在使用'htmlpurifier'來自動執行段落,但不幸的是它不能處理單行換行。 – Brett 2015-04-06 09:50:03

回答

1

這在PHP中會很複雜。 nl2br不適合在要處理的文本中保留HTML,因此您將不得不使用DOM解析器來執行此操作。

或者你可以編寫自己的函數來遍歷整個文本。每當它遇到一個開放<它應該保持一個標誌,這是一個>後重置。當它遇到一個換行符時,它可以檢查該標誌以查看該字符是否應該被保留或由<br>取代。通過這種方式,您可以逐個字符地構建結果字符串。請注意,無效標記可能很容易破壞這樣的功能。

但我認爲一個簡單,更好的解決方法是隻需添加一小片的CSS:

white-space: pre-line; 

應用此列表中的父(和隱含的名單及其項目太) 。這將導致文本行爲正常,除了文本中的換行符上的文本也被打破。

+0

嗯,我更關心的不僅僅是「修復」列表標記,還有保留語義上正確的代碼。我喜歡你的功能的想法,但正如你所說,它可以用無效的標記打破 - 雖然我想代碼可以預先通過'tidy'這樣的東西來運行嗎? – Brett 2015-04-06 09:53:58

+0

當然可以。但是,一點點破碎也不算太壞。但是,例如文本中錯誤地未轉義的'<'可以將簡單的解析器放在'標籤'模式中,之後它不會再改變'
'中的'\ n',直到遇到'>'。同樣,標籤中的屬性值內部的非轉義的'>'將導致簡單的解析器認爲標籤已經結束,並且它將開始替換,而不應該。儘管如此,取決於你的輸入來自哪裏,這對你來說可能是可以接受的(你可能會認爲bbcode處理器返回有效的HTML)。但你有沒有考慮過CSS解決方案? – GolezTrol 2015-04-06 12:10:08

+0

之後,你說我再次確認和bbcode分析器確實說它返回有效的html,即使從嚴重損壞的bbcode;所以我不認爲這應該是一個問題。傾向於清除那個CSS修復程序,因爲我想嘗試並輸出正確的代碼,而不是被元素粘在他們不應該的位置。 – Brett 2015-04-06 12:39:51

相關問題