2010-06-09 6 views
15

Quiero convertir este [email protected] aCómo convertir todos los caracteres a su equivalente entidad HTML usando PHP

hello@domain.com 

que he intentado:

url_encode($string) 

Esto proporciona la misma cadena entré, volvió con el símbolo @ convierte en %40

también trató:

htmlentities($string) 

esto proporciona la misma cadena de vuelta.

Estoy usando un juego de caracteres UTF8. No estoy seguro si esto hace la diferencia ....

+0

ley He eliminado mi respuesta porque me di cuenta que no es bueno. (Gracias Artefacto) sin embargo, esto realmente no es suficiente protección contra los robots de spam ... –

+0

Soy consciente de que no es totalmente infalible, sin embargo, he tenido buenos resultados al usar esta función en el pasado, codificando mi dirección de correo electrónico utilizando servicios en línea. Ahora estoy tratando de construirlo en un CMS que estoy construyendo. – Ash

Respuesta

39

aquí va (asume UTF-8, pero es trivial para cambiar):

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; 
} 

EDITAR alternativa recomendada utilizando 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); 
} 
+0

Agradable. --------- –

+0

No es necesario imprimir $ cur como unsigned cuando se convierte a una cadena en '$ res. =" & # ". $ cur. ";"; 'porque el rango de caracteres Unicode no llega tan lejos. Sin embargo, si tiene una secuencia UTF-8 no válida, esto podría dar valores negativos (no sé si mb_convert_encoding valida el rango). – Artefacto

+0

Esta es una respuesta brillante por 3 razones: 1. No podría haberlo pensado yo mismo. 2. Es elegante y funciona bien. 3. Aprendí muchas cosas buenas de él. Gracias. – Ash

8

manera mucho más fácil de hacer esto:

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

Puede cambiar la codificación si está utilizando algo diferente.

  • Rango de mapa fijo. Gracias a Artefacto.
+0

Bueno, no lo he probado, pero supongo que también tiene que cambiar el mapa para cubrir todos los caracteres Unicode. – Artefacto

+0

probablemente algo como '$ convmap = array (0x000000, 0x10ffff, 0, 0xffffff);' (no probado) – Artefacto

+0

El convmap en este comentario funciona: http://www.php.net/manual/en/function.mb-encode -numericentity.php # 88586 – koen

1
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; 

} 

la función anterior funciona para 1 carácter, pero si tiene una cadena que puede hacer como esto

$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 

} 
Cuestiones relacionadas