2016-01-22 6 views
3

Я пытаюсь показать символы HTML Entityhtmlentites не работает смайлики

echo htmlentities(htmlentities("&")); 
//outputs & 
echo htmlentities(htmlentities("<")); 
//outputs &lt; 

, но это не похоже на работу с смайликами

echo htmlentities(htmlentities("")); 
//outputs 

Как я могу получить его на выход &#128526;?


Редактировать:

Я пытаюсь отобразить ввод строки пользователем со всеми закодированными объектами html.
echo htmlentities(htmlentities($input))

Пример: "this & that " -> "this &amp; that &#128526;"

+2

Из любопытства .. почему это вообще? Если вы выводите unicode, нет необходимости в сущности. – Evert

+0

'эхо htmlentities (htmlentities (» &")); '' выводит & усилителя; ' –

+0

нет, если тип содержимого является текст/html первый & преобразуется в & –

ответ

5

Это работает для обычных объектов HTML, смайликов UTF-8 (и других вещей utf), а также регулярных строк.

У меня возникли проблемы с пустым значением строки, поэтому мне пришлось включить это условие в функцию.

function entities($string) { 
    $stringBuilder = ""; 
    $offset = 0; 

    if (empty($string)) { 
     return ""; 
    } 

    while ($offset >= 0) { 
     $decValue = ordutf8($string, $offset); 
     $char = unichr($decValue); 

     $htmlEntited = htmlentities($char); 
     if($char != $htmlEntited){ 
      $stringBuilder .= $htmlEntited; 
     } elseif($decValue >= 128){ 
      $stringBuilder .= "&#" . $decValue . ";"; 
     } else { 
      $stringBuilder .= $char; 
     } 
    } 

    return $stringBuilder; 
} 

// source - http://php.net/manual/en/function.ord.php#109812 
function ordutf8($string, &$offset) { 
    $code = ord(substr($string, $offset,1)); 
    if ($code >= 128) {  //otherwise 0xxxxxxx 
     if ($code < 224) $bytesnumber = 2;    //110xxxxx 
     else if ($code < 240) $bytesnumber = 3;  //1110xxxx 
     else if ($code < 248) $bytesnumber = 4; //11110xxx 
     $codetemp = $code - 192 - ($bytesnumber > 2 ? 32 : 0) - ($bytesnumber > 3 ? 16 : 0); 
     for ($i = 2; $i <= $bytesnumber; $i++) { 
      $offset ++; 
      $code2 = ord(substr($string, $offset, 1)) - 128;  //10xxxxxx 
      $codetemp = $codetemp*64 + $code2; 
     } 
     $code = $codetemp; 
    } 
    $offset += 1; 
    if ($offset >= strlen($string)) $offset = -1; 
    return $code; 
} 

// source - http://php.net/manual/en/function.chr.php#88611 
function unichr($u) { 
    return mb_convert_encoding('&#' . intval($u) . ';', 'UTF-8', 'HTML-ENTITIES'); 
} 

/* ---- */ 

var_dump(entities("&")) . "\n"; 
var_dump(entities("<")) . "\n"; 
var_dump(entities("")) . "\n"; 
var_dump(entities("☚")) . "\n"; 
var_dump(entities("")) . "\n"; 
var_dump(entities("A")) . "\n"; 
var_dump(entities("Hello world")) . "\n"; 
var_dump(entities("this & that ")) . "\n"; 
+0

Это работает отлично! спасибо –

2

$emoji = "\xF0\x9F\x98\x8E"; // ее ваши смайлики

Я получаю эту функцию обратного вызова от convert unicode to html entities hex

$hex = preg_replace_callback('/[\x{80}-\x{10FFFF}]/u', function ($m) { 
    $char = current($m); 
    $utf = iconv('UTF-8', 'UCS-4', $char); 
    return sprintf("&#x%s;", ltrim(strtoupper(bin2hex($utf)), "0")); 
}, $emoji); 

echo $hex; 

echo json_encode(("\xF0\x9F\x98\x8E")); // его декодированию. htmlentities не работает с ним.

В порядке?

+0

Это не работает для регулярных html-объектов. Строка, которую я пытаюсь для преобразования вводится пользователем, поэтому я не знаю, будет ли это «" или «&» или «А».Мне понадобится функция, которая принимает любой вход и выводит строку с html-объектами, закодированными –

+0

. Ввод также может быть строкой с более чем одним символом. –

+0

Как насчет использования чего-то подобного вместо htmlentities? http://php.net/manual/en/function.bin2hex.php#48861, возможно, вам понадобится сделать контрольный показатель. Но все выглядит нормально. – FZE

2

htmlentities документации говорится, что

все символы, которые имеют HTML характер сущности эквиваленты являются переведены на этих лиц.

Ваши смайлики не имеет эквивалента, как &lt; для <, поэтому он не преобразуется. &#128526; - это всего лишь HTML-код, а не объект HTML. Функция

function htmlEntitiesOrCode($string) { 
    //try htmlentities first 
    $result = htmlentities($string, ENT_COMPAT, "UTF-8"); 

    //if the output is different from input, an entity was returned 
    if ($result != $string) { 
     return $result; 
    } 

    //get the html code 
    $offset = 0; 
    $code = ord(substr($string, $offset,1)); 
    if ($code >= 128) { 
     if ($code < 224) { 
      $bytesnumber = 2; 
     } else if ($code < 240) { 
      $bytesnumber = 3; 
     } else if ($code < 248) { 
      $bytesnumber = 4; 
     } 
     $codetemp = $code - 192 - ($bytesnumber > 2 ? 32 : 0) - ($bytesnumber > 3 ? 16 : 0); 
     for ($i = 2; $i <= $bytesnumber; $i++) { 
      $offset ++; 
      $code2 = ord(substr($string, $offset, 1)) - 128; 
      $codetemp = $codetemp*64 + $code2; 
     } 
     $code = $codetemp; 
    } 
    $offset += 1; 
    if ($offset >= strlen($string)) { 
     $offset = -1; 
    } 

    $result = "&#" . $code; 
    return $result; 
} 

HTML код взят здесь: http://php.net/manual/en/function.ord.php#109812