Интерполяция строки Феникса, содержащая \ n и name = "abc" в HTML - PullRequest
0 голосов
/ 20 мая 2019

Я хочу генерировать HTML-контент в Фениксе.Я не могу использовать интерполяцию при добавлении name="abc".Я получаю ошибку в ".

Использование \ в тексте также показывает \, например, text = "This is an name=\"abc\" string" дает text = "This is an name=\"abc\" string".

Может кто-нибудь подсказать, как можно получить необработанную строку, содержащую name="abc"?

Ответы [ 2 ]

1 голос
/ 20 мая 2019

Строка содержит только name="abc", проблема в том, что когда вы видите ее в терминале, Elixir экранирует двойные кавычки, поэтому вы можете скопировать и вставить ее в свой код.Если сомневаетесь, используйте IO.puts(text), и он напечатает текст без каких-либо изменений:

iex(1)> text = "This is an name=\"abc\" string"
"This is an name=\"abc\" string"
iex(2)> IO.puts text
This is an name="abc" string
:ok
0 голосов
/ 21 мая 2019

Если вы хотите интерполировать некоторые двойные кавычки в строку, вы можете попробовать это:

iex(1)> text = "This is a name=#{"abc"} string"
"This is a name=abc string"

Это не сработало.Вам нужно сделать что-то дополнительное:

iex(16)> text = "This is a name=#{"\"abc\""} string"
"This is a name=\"abc\" string"

Когда вы пишете что-то вроде этого:

text = "This is a name="abc" string"

Вы должны задаться вопросом, как получается, что эликсир знает, что последняя цитата - это цитата, которая заканчиваетсястрока.Другими словами, почему эликсир не думает, что это ваша строка:

text = "This is a name="  

, а остальная часть строки - просто мусор, который не соответствует синтаксису эликсира?Чтобы сказать эликсиру, что двойная кавычка после знака = - это не конец строки, а просто еще один символ в строке, вы экранируете двойная кавычка, например:

text = "This is a name=\"abc\" string"

Теперь эликсир увидит двойную кавычку после string в качестве окончания строки.

Далее, это сложная задача избежать двойных кавычек в строке, поэтому elixir предоставляет возможность избежать этого с ~s сигилой:

iex(17)> text = ~s{This is a name="abc" string}
"This is a name=\"abc\" string"

С символом ~s вы можете использовать различныепары символов, которые окружают вашу строку, например () или <> или | | или / /.Вам нужно использовать пару символов, которая не найдена в строке - иначе вы столкнетесь с той же проблемой, что и с внутренними двойными кавычками.

Наконец, вы можете доказать, что строка name=\"abc\" имеет только 10символы, то есть символы name="abc", например:

iex(13)> s1 = ~s{name="abc"}
"name=\"abc\""

iex(14)> String.length s1
10
...