Intereting Posts

Как преобразовать все символы в их эквивалент сущности html с помощью PHP

Я хочу преобразовать этот hello@domain.com в

 hello@domain.com 

Я пытался:

 url_encode($string) 

это обеспечивает ту же строку, которую я ввел, возвращен с символом @, преобразованным в %40

также попытался:

 htmlentities($string) 

это обеспечивает ту же строку справа.

Я использую кодировку UTF8. не уверен, что это имеет значение ….

Здесь он идет (предполагает UTF-8, но это тривиально изменить):

 function encode($str) { $str = mb_convert_encoding($str , 'UTF-32', 'UTF-8'); //big endian $split = str_split($str, 4); $res = ""; foreach ($split as $c) { $cur = 0; for ($i = 0; $i < 4; $i++) { $cur |= ord($c[$i]) << (8*(3 - $i)); } $res .= "&#" . $cur . ";"; } return $res; } 

EDIT Рекомендуемая альтернатива с использованием unpack :

 function encode2($str) { $str = mb_convert_encoding($str , 'UTF-32', 'UTF-8'); $t = unpack("N*", $str); $t = array_map(function($n) { return "&#$n;"; }, $t); return implode("", $t); } 

Гораздо проще сделать это:

 function convertToNumericEntities($string) { $convmap = array(0x80, 0x10ffff, 0, 0xffffff); return mb_encode_numericentity($string, $convmap, "UTF-8"); } 

Вы можете изменить кодировку, если используете что-то другое.

  • Фиксированный диапазон карт. Благодаря Artefacto.
 function uniord($char) { $k=mb_convert_encoding($char , 'UTF-32', 'UTF-8'); $k1=ord(substr($k,0,1)); $k2=ord(substr($k,1,1)); $value=(string)($k2*256+$k1); return $value; } 

эта функция работает для 1 символа, но если у вас есть строка, вы можете сделать это

 $string="anytext"; $arr=preg_split(//u,$string,-1,PREG_SPLIT_NO_EMPTY); $temp=" "; foreach($arr as $v){ $temp="&#".uniord($v);//prints the equivalent html entity of string }