Wydaje można uruchomić template.HTMLEscape() na tekst, aby go najpierw zdezynfekować, a następnie wykonaj \ n do
podstawienia, któremu ufasz, a następnie użyj go jako danych z prefiksu i zaufanych szablonów.
Aktualizacja: Rozszerzenie na przykład Kocka, jest to, co miałem na myśli:
package main
import (
"html/template"
"os"
"strings"
)
const page = `<!DOCTYPE html>
<html>
<head>
</head>
<body>
<p>{{.}}</p>
</body>
</html>`
const text = `first line
<script>dangerous</script>
last line`
func main() {
t := template.Must(template.New("page").Parse(page))
safe := template.HTMLEscapeString(text)
safe = strings.Replace(safe, "\n", "<br>", -1)
t.Execute(os.Stdout, template.HTML(safe)) // template.HTML encapsulates a known safe HTML document fragment.
}
http://play.golang.org/p/JiH0uD5Zh2
Wyjście jest
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<p>first line<br><script>dangerous</script><br>last line</p>
</body>
</html>
i tekstu wydanego w przeglądarce jest
first line
<script>dangerous</script>
last line
nie może oddać go do 'template.HTML' ponieważ mój ciąg nie jest bezpieczny. Czy mógłbyś rozwinąć sztuczkę z Pileline? Wielkie dzięki –
jeśli łańcuch nie jest bezpieczny, to potok nie pomoże. Spróbuj podzielić ciąg na '\ n" 'i przekazując wynikowy plaster do szablonu. Użyj 'range', aby wydrukować ciąg znaków i wstaw'
'. Na przykład: 'Arr: = stringi.Split (myString," \ n ")' w kodzie go i '{{range Arr}} {{.}}
{{end}}' w szablon. – dskinner
@dskinner, wiem, że jest późno, ale powinieneś napisać swoje jako pełną odpowiedź. To znacznie czystsze rozwiązanie. – Nashenas