用HTML br 替換 換行前先想一想
文章推薦指數: 80 %
const setTextLineFeed = text => text.replace(/\n/g,'
');. 將後端傳來包含換行符號的字串,先丟進這個function 處理過,好像很合理。
現在處理 ...
SimonAllen技術部落格
Menu
Home
About
Series
Tags
Archives
RSS
SignIn
這篇算是一個隨手紀錄,不要輕易用
替換換行↵,先想想有沒有其他的方式。
起因
前陣子在處理前人的Legacycode,有個情境是使用者在後台頁面輸入文章,前端把其show在前台頁面上。
當然後端會在需顯示的前台頁面API將其(字串)發過來,這個字串不包含HTML標籤,可能包含換行符號,為了處理這個狀況,前人寫了個共用function來將換行符號替換成HTML
標籤,例如:
constsetTextLineFeed=text=>text.replace(/\n/g,'
');
將後端傳來包含換行符號的字串,先丟進這個function處理過,好像很合理。
現在處理過的字串多了HTML標籤
,前端開發是用React,為了解決字串多了
標籤並達成換行,原本顯示文字的地方就用了dangerouslySetInnerHTML
這樣寫有什麼問題?
其實
本身沒什麼問題,有問題是上面這個思路。
replace
後端API發來的response參數可能是這樣
text:"早安↵您好"
預期網頁上看到
早安
您好
而不是
早安↵您好
//or
早安您好
text值本來不包含HTMLTag,為了要處理↵,才用上了自己寫的setTextLineFeed去replace,只不過replace後的text變成
"早安
您好"
顯示方面就必須這樣寫
普遍來說,從程式碼中注入HTML是個冒險的行為,你會很輕易地讓使用者暴露在cross-sitescripting(XSS)攻擊風險之下。
所以在React裡你還是可以直接注入HTML,但是你必須使用dangerouslySetInnerHTML,然後傳入一個有__html為key的object 只要用到innerHTML就有XSS風險,尤其不能信任使用者自行輸入的內容。
但是現實世界中,即便用了React開發網站,可能還是有需要用到innerHTML的情境(例如後端發來包含HTML的字串),說穿了就是React要提醒開發者注意XSS攻擊故意將包好的innerHTML命名這麼長和使用方式改的很迂迴。
該怎麼改? 總之釐清一下,現在要處理這兩點問題: 文字換行 預防潛在的xss風險 使用CSS處理換行 使用CSSwhite-space、overflow-wrap、word-break可以很好的處理換行 overflow-wrap https://developer.mozilla.org/zh-TW/docs/Web/CSS/overflow-wrap word-break https://developer.mozilla.org/en-US/docs/Web/CSS/word-break white-space https://developer.mozilla.org/zh-TW/docs/Web/CSS/white-space CSS具體用法就不解釋,詳情看文件。
所以setTextLineFeed這個function用不到了,可以拿掉replace
這個動作。
原本這樣寫 改成
{text}
p{ white-space:pre-wrap; } 就好了! 使用replace替換危險字元 如果不使用CSS解,照舊使用dangerouslySetInnerHTML,那我們需要先濾掉潛在的危險字元才replace換行成constreplaceXSSText=str=>{ returnstr.replace(/['&/]/g,dangerText=>{ return{ '':'>', "'":''', '/':'/', }[dangerText]; }); }; 不過要注意,若dangerouslySetInnerHTML對象本來本來就包含HTMLTag(不然幹嘛用dangerouslySetInnerHTML),那用上面這個function去處理就完全沒意義了,會將、'、/顯示出來。
後記 其實這篇技術含量不高,但和周遭一些前端聊到,發現好幾位第一時間都是想replace,也許是我同溫層的問題(汗) 我覺得挺可怕的是:對很多寫JS習慣的前端工程師來說,遇到類似的問題都是習慣性地用JS去處理這件事情,撇開開發上的資安敏感度,CSS能解決的事就應當用CSS才對。
參考 https://zh-hant.reactjs.org/docs/dom-elements.html#dangerouslysetinnerhtml https://developer.mozilla.org/zh-TW/docs/Web/CSS/overflow-wrap https://developer.mozilla.org/en-US/docs/Web/CSS/word-break https://developer.mozilla.org/zh-TW/docs/Web/CSS/white-space #javascript #React.js #css SimonAllen Follow Following 前端工程師 愛做白日夢的工程師\(^▽^)/ Facebook RelatedPosts ASP.NETCoreWebAPI入門教學-範例檔使用LocalDB練習 TalllKai WhyandHowIstartlearningprogramminglanguage? pei_______ Vue.js學習旅程Mile2–環境建置篇 yuhantaiwan Comments
延伸文章資訊
- 1[HTML][新手] 03. 分行與分隔線(br, hr)與註解 - 進度條
</html>. 輸出結果:. 你會發現文字是並排的,並沒有換行,它並不會像Word按下Enter就跳到下一行,所以在程式碼裡面的Enter並不代表換行符,按Enter並 ...
- 2HTML 換行br 與p 標籤
HTML 本來就是用來編輯網頁內容的一種語法,當然對於本文的編排就會有所謂的換行或段落這樣的功能,在HTML 中,換行有兩個常見的標籤,分別是<br> 與<p>,其中<br> ...
- 3用HTML br 替換 換行前先想一想
const setTextLineFeed = text => text.replace(/\n/g,'<br/>');. 將後端傳來包含換行符號的字串,先丟進這個function 處理過,好像...
- 4如何讓文字中的\n 在HTML中換行?
2、使用CSS的white-space 屬性保留空白符序列,但是正常地進行換行。 white-space: pre-line;. white-space 屬性可能的值:. normal:預設。空...
- 5HTML <br> 換行標籤(tag) - Fooish 程式技術