Как заменить разрывные линии в twig

Я хочу заполнить массив JavaScript значениями переменных PHP, используя TWIG.

<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>"}) }}";

Но это не помогает. Он по-прежнему остается в виде нескольких строк ...


person sh3211    schedule 07.05.2012    source источник
comment
Единственный правильный способ сделать это: {{ post.content | replace({ '\r\n': '\\r\\n', '\n': '\\n', '\r': '\\r' }) }}   -  person caw    schedule 17.01.2017
comment
Теперь вы также можете использовать обратные кавычки (литералы шаблонов), чтобы поместить код с новыми строками в строку JavaScript.   -  person jcubic    schedule 12.04.2019


Ответы (6)


Для аналогичной проблемы (вывод пользовательских данных в Javascript) я обнаружил, что необходимо следующее:

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

т.е. замените \r, а также \n пробелами. Это связано с тем, что некоторый пользовательский контент (особенно для пользователей Windows) может содержать \r (возврат каретки), а также разрывы строк, которые, похоже, все еще нарушают Javascript, если их не удалить.

Для меня nl2br не подходил, потому что я загружал пользовательский контент в метод Javascript (для добавления введенных пользователем адресов на карту Google, для чего это стоит), поэтому я не хотел никаких разрывов строк, HTML или в противном случае.

person Nick F    schedule 18.11.2014

Лучший способ (и хороший способ) написать javascript с помощью Twig (если вы не хотите \r\n) таков:

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

Замена <br /> может, конечно, сработать, но вы столкнетесь с другими проблемами в javascript, используя данные из ваших данных. Используя экранирование javascript, он отлично напишет действительный javascript так, как вы ожидаете.

Для получения дополнительной информации о escape-фильтре:

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

person Yann Chabot    schedule 22.10.2015

Существует фильтр nl2br: http://twig.sensiolabs.org/doc/filters/nl2br.html

person Wojciech Jasiński    schedule 12.06.2012
comment
К сожалению, это не решение для заданного вопроса в контексте экранирования \n и \r в JavaScript, потому что фильтр nl2br ветки - это простой откат к функции nl2br() в PHP, которая вообще не заменяет символы \n и \r, а заменяет их на <br />\n\r, поэтому пробелы все еще в коде. - person Athlan; 24.11.2014

Используйте 1_

person Anwar Abdelkabir    schedule 28.08.2014

Если вы хотите просто удалить тормозные магистрали, это не работает:

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

'\' — это специальный знак, поэтому его нужно экранировать. Это будет работать:

{{ post.content | replace({"\\n":""}) }}
person Jarek Jakubowski    schedule 17.07.2013

Вы должны использовать тег {% spaceless %}{% endspaceless %}, например,

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

Наслаждаться ;-)

person user6796613    schedule 05.09.2016