PHP特殊字符到html实体代码

时间:2017-05-31 08:35:28

标签: php special-characters html-entities array-map

我正在尝试将我的数组中的特殊字符转换为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;"
]

3 个答案:

答案 0 :(得分:3)

您必须使用ENT_QUOTESENT_HTML5 flags

$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;',
)

答案 1 :(得分:2)

你必须使用像这样的htmlentities的第二个参数“flag”

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

答案 2 :(得分:0)

注意:我没有检查实体列表,因此没有注意到所有字符都有可用的翻译。我将离开答案,以防它可以帮助其他人使用不同的字符列表。

来自docs(强调我的):

  

将具有HTML字符实体等效项的所有字符转换为这些实体。

     

另见

     

在其他情况下,mb_convert_encoding()使用@foreach($products as $product) {{ $product->name }} @endforach {{ $products->links() }} 作为目标编码可以获得更好的结果。问题是你的实体中没有一个明显的模式(大多数是基本的US-ASCII字符,在HTML中没有任何特殊含义,因此不需要为任何通常的任何转换为​​HTML实体原因)。所以你有两个选择: