PHP特殊字符对HTML实体代码



我试图将我的数组中的特殊字符转换为html实体代码:

这是我的助手数组:

'specialChars' => [
    '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+',
    ',', '/', ':', ';', '<', '=', '>', '?', '@', '[', '\',
    ']', '^', '_', '`', '{', '|', '}', '§', '©', '¶'
]

这是功能:

    public static function convert($specialChars = [])
    {
        $htmlEntityArray = [];
        if(count($specialChars) == 0)
        {
            $specialChars = Config::get('constants.specialChars'); // gets the special char from the helper array
        }
        foreach ($specialChars as $key => $value)
        {
            $htmlEntityArray = array_map("htmlentities", $specialChars);
        }
        return $htmlEntityArray;
    }

,但这只会返回我这个数组,它成功转换了一些,而有些则没有:

array:32 [▼
  0 => "!"
  1 => "&quot;"
  2 => "#"
  3 => "$"
  4 => "%"
  5 => "&amp;"
  6 => "'"
  7 => "("
  8 => ")"
  9 => "*"
  10 => "+"
  11 => ","
  12 => "/"
  13 => ":"
  14 => ";"
  15 => "&lt;"
  16 => "="
  17 => "&gt;"
  18 => "?"
  19 => "@"
  20 => "["
  21 => ""
  22 => "]"
  23 => "^"
  24 => "_"
  25 => "`"
  26 => "{"
  27 => "|"
  28 => "}"
  29 => "&sect;"
  30 => "&copy;"
  31 => "&para;"
]

您必须使用ENT_QUOTESENT_HTML5标志。

$specialChars = [
    '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+',
    ',', '/', ':', ';', '<', '=', '>', '?', '@', '[', '\',
    ']', '^', '_', '`', '{', '|', '}', '§', '©', '¶'
];
var_export(array_map(function ($str) { return htmlentities($str, ENT_QUOTES | ENT_HTML5); }, $specialChars));

此返回:

array (
    0 => '&excl;',
    1 => '&quot;',
    2 => '&num;',
    3 => '&dollar;',
    4 => '&percnt;',
    5 => '&amp;',
    6 => '&apos;',
    7 => '&lpar;',
    8 => '&rpar;',
    9 => '&ast;',
    10 => '&plus;',
    11 => '&comma;',
    12 => '&sol;',
    13 => '&colon;',
    14 => '&semi;',
    15 => '&lt;',
    16 => '&equals;',
    17 => '&gt;',
    18 => '&quest;',
    19 => '&commat;',
    20 => '&lbrack;',
    21 => '&bsol;',
    22 => '&rsqb;',
    23 => '&Hat;',
    24 => '&lowbar;',
    25 => '&grave;',
    26 => '&lbrace;',
    27 => '&vert;',
    28 => '&rcub;',
    29 => '&sect;',
    30 => '&copy;',
    31 => '&para;',
)

您必须使用htmlentities的第二个参数" flag"

$htmlEntityArray = array_map(function($char) {
  return htmlentities($char, ENT_QUOTES | ENT_HTML5);
}, $specialChars);

注意:我没有检查实体列表,因此没有注意到所有字符都有可用的翻译。我要留下答案,以防万一它可以帮助其他人的字符列表。


来自Docs(重点是我的(:

所有字符具有HTML字符实体等效物均转化为这些实体。

另请参见

  • get_html_translation_table(( - 返回htmlspecialchars和htmlentities使用的翻译表

在其他情况下,使用HTML-ENTITIES作为目标编码的mb_convert_encoding((,您可能会获得更好的结果。问题在于您的实体中没有明显的模式(其中大多数是基本的US-ASCII字符,它们在HTML中没有任何特殊含义,因此不需要将任何一个通常都转换为HTML实体原因(。因此,您要有两个选择:

  • 在例如preg_replace_callback((和pack((。
  • 硬编码完整的实体列表,并用strtr((完成替换。

最新更新