2010-06-09 13 views
15

Je veux convertir ce [email protected] àComment convertir tous les caractères à leur entité HTML équivalente en utilisant PHP

hello@domain.com 

J'ai essayé:

url_encode($string) 

fournit la même chaîne je suis entré, revint avec le symbole @ converti en %40

aussi essayé:

htmlentities($string) 

cela fournit la même chaîne de retour. J'utilise un jeu de caractères UTF8. ne sais pas si cela fait une différence ....

+0

ley J'ai supprimé ma réponse parce que je compris que ce n'est pas bon. (Merci Artefacto) Cependant, ce n'est pas vraiment une protection suffisante contre les robots spammeurs .... –

+0

Je suis conscient que ce n'est pas complètement infaillible, mais j'ai eu de bons résultats en utilisant cette fonctionnalité dans le passé, en encodant mon adresse e-mail en utilisant les services en ligne. J'essaye maintenant de le construire dans un CMS que je construis. – Ash

Répondre

39

Ici, il va (suppose UTF-8, mais il est trivial de changer):

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 alternative recommandée à l'aide 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

Nice. --------- –

+0

Il n'est pas nécessaire d'imprimer $ cur comme non signé lors de la conversion en $ res. $ cur. ";"; 'parce que la gamme de caractères Unicode ne va pas aussi loin. Cependant, si vous avez une séquence UTF-8 invalide, cela pourrait donner des valeurs négatives (je ne sais pas si mb_convert_encoding valide la plage). – Artefacto

+0

C'est une réponse brillante pour 3 raisons: 1. Je n'aurais pas pu y penser moi-même. 2. Est élégant, et fonctionne bien, 3.J'ai appris beaucoup de bonnes choses à partir de cela. Merci. – Ash

8

manière beaucoup plus facile de le faire:

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

Vous pouvez changer l'encodage si vous utilisez quelque chose de différent.

  • Plage de carte fixe. Merci à Artefacto.
+0

Bien, je n'ai pas testé, mais je suppose que vous devez également changer la carte pour couvrir tous les caractères Unicode. – Artefacto

+0

probablement quelque chose comme '$ convmap = tableau (0x000000, 0x10ffff, 0, 0xffffff);' (non testé) – Artefacto

+0

Le convmap dans ce commentaire fonctionne: http://www.php.net/manual/fr/fonction.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 fonction ci-dessus fonctionne pour 1 caractère, mais si vous avez une chaîne que vous pouvez faire comme ceci

$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 

}