mirror of
https://gitee.com/johng/gf.git
synced 2024-11-30 11:18:02 +08:00
104 lines
2.8 KiB
Go
104 lines
2.8 KiB
Go
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
|
//
|
|
// This Source Code Form is subject to the terms of the MIT License.
|
|
// If a copy of the MIT was not distributed with this file,
|
|
// You can obtain one at https://github.com/gogf/gf.
|
|
|
|
// Package ghtml provides useful API for HTML content handling.
|
|
package ghtml
|
|
|
|
import (
|
|
"html"
|
|
"reflect"
|
|
"strings"
|
|
|
|
strip "github.com/grokify/html-strip-tags-go"
|
|
)
|
|
|
|
// StripTags strips HTML tags from content, and returns only text.
|
|
// Referer: http://php.net/manual/zh/function.strip-tags.php
|
|
func StripTags(s string) string {
|
|
return strip.StripTags(s)
|
|
}
|
|
|
|
// Entities encodes all HTML chars for content.
|
|
// Referer: http://php.net/manual/zh/function.htmlentities.php
|
|
func Entities(s string) string {
|
|
return html.EscapeString(s)
|
|
}
|
|
|
|
// EntitiesDecode decodes all HTML chars for content.
|
|
// Referer: http://php.net/manual/zh/function.html-entity-decode.php
|
|
func EntitiesDecode(s string) string {
|
|
return html.UnescapeString(s)
|
|
}
|
|
|
|
// SpecialChars encodes some special chars for content, these special chars are:
|
|
// "&", "<", ">", `"`, "'".
|
|
// Referer: http://php.net/manual/zh/function.htmlspecialchars.php
|
|
func SpecialChars(s string) string {
|
|
return strings.NewReplacer(
|
|
"&", "&",
|
|
"<", "<",
|
|
">", ">",
|
|
`"`, """,
|
|
"'", "'",
|
|
).Replace(s)
|
|
}
|
|
|
|
// SpecialCharsDecode decodes some special chars for content, these special chars are:
|
|
// "&", "<", ">", `"`, "'".
|
|
// Referer: http://php.net/manual/zh/function.htmlspecialchars-decode.php
|
|
func SpecialCharsDecode(s string) string {
|
|
return strings.NewReplacer(
|
|
"&", "&",
|
|
"<", "<",
|
|
">", ">",
|
|
""", `"`,
|
|
"'", "'",
|
|
).Replace(s)
|
|
}
|
|
|
|
// SpecialCharsMapOrStruct automatically encodes string values/attributes for map/struct.
|
|
func SpecialCharsMapOrStruct(mapOrStruct interface{}) error {
|
|
var (
|
|
reflectValue = reflect.ValueOf(mapOrStruct)
|
|
reflectKind = reflectValue.Kind()
|
|
)
|
|
for reflectValue.IsValid() && (reflectKind == reflect.Ptr || reflectKind == reflect.Interface) {
|
|
reflectValue = reflectValue.Elem()
|
|
reflectKind = reflectValue.Kind()
|
|
}
|
|
switch reflectKind {
|
|
case reflect.Map:
|
|
var (
|
|
mapKeys = reflectValue.MapKeys()
|
|
mapValue reflect.Value
|
|
)
|
|
for _, key := range mapKeys {
|
|
mapValue = reflectValue.MapIndex(key)
|
|
switch mapValue.Kind() {
|
|
case reflect.String:
|
|
reflectValue.SetMapIndex(key, reflect.ValueOf(SpecialChars(mapValue.String())))
|
|
case reflect.Interface:
|
|
if mapValue.Elem().Kind() == reflect.String {
|
|
reflectValue.SetMapIndex(key, reflect.ValueOf(SpecialChars(mapValue.Elem().String())))
|
|
}
|
|
}
|
|
}
|
|
|
|
case reflect.Struct:
|
|
var (
|
|
fieldValue reflect.Value
|
|
)
|
|
for i := 0; i < reflectValue.NumField(); i++ {
|
|
fieldValue = reflectValue.Field(i)
|
|
switch fieldValue.Kind() {
|
|
case reflect.String:
|
|
fieldValue.Set(reflect.ValueOf(SpecialChars(fieldValue.String())))
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|