2012-05-07 37 views
9

我想用使用TWIG的PHP變量中的值填充JavaScript數組。如何替換樹枝中的斷線

<script type="text/javascript"> 
    var cont=new Array(); 
    {% for key, post in posts %} 
    cont[{{ key }}] = "{{ post.content }}"; 
    {% endfor %} 
</script> 

的問題是,我有post與若干行的變量,所以上面的代碼使分離以幾行JS命令,即被翻譯爲多個命令,我有一個錯誤。

所以我認爲我需要將所有'新行'替換爲「\ n」。

我試着這樣做:

cont[{{ key }}] = "{{ post.content | replace({"\n":"<br>"}) }}"; 

但它並不能幫助。它仍然繼續擔任幾行...

+0

這樣做的唯一正確方法如下:'{{post。內容|替換({'\ r \ n':'\\ r \\ n','\ n':'\\ n','\ r':'\\ r'})}}' – caw

回答

7
+2

不幸的是,這是在上下文中轉義'\ n'和'\ r'的問題不是解決方法,因爲twig的'nl2br'過濾器簡單地回退到PHP中的'nl2br()'函數,它不會替代'\ n'和' \ r'字符,但用'
\ n \ r'替換它們,所以空白仍然在代碼中。 – Athlan

4

如果你只想刪除剎車線,這是行不通的:

{{ post.content | replace({"\n":""}) }} 

「\」是一個特殊的標誌,所以你需要逃避它。這將工作:

{{ post.content | replace({"\\n":""}) }} 
4

使用{{ post.content | nl2br }}

20

對於類似的問題(輸出用戶數據到JavaScript),我發現下面是必要的:

post.content|replace({"\n":' ', "\r":' '}) 

即。用空格替換\r以及\n。這是因爲某些用戶輸入的內容(特別是Windows上的用戶)可能包含\r(回車符)以及換行符,如果不刪除,它似乎仍然會打破Javascript。

對我來說,nl2br並不合適,因爲我正在將用戶內容添加到Javascript方法中(用於將用戶輸入的地址添加到Google Map中,因爲它的價值),所以我不想要任何行休息,HTML或其他。

7

的最好方法(和好辦法)編寫使用的樹枝(如果你不想\r\n)一些JavaScript是這樣說的:

{{ example|e('js') }} 

更換<br />就可以了,當然,工作,但你會使用數據中的數據在javascript中遇到其他問題。使用JavaScript轉義,它會完全按照您期望的方式編寫有效的JavaScript。

有關escape過濾器的詳細信息:

http://twig.sensiolabs.org/doc/filters/escape.html

+2

這個答案應該被標記爲正確的答案。 –

0

你必須使用一個{%spaceless%} {%endspaceless%}標籤,這樣,

<script type="text/javascript"> 
    var cont=new Array(); 
    {% for key, post in posts %} 
    cont[{{ key }}] = "{% spaceless %}{{ post.content }}{% endspaceless %}"; 
    {% endfor %} 
</script> 

享受; - )