2010-06-09 7 views
15

chcę przekonwertować ten [email protected] doJak przekonwertować wszystkie znaki na ich html podmiotu równowartość wykorzystaniem PHP

hello@domain.com 

Próbowałem:

url_encode($string) 

ten zapewnia ten sam ciąg wszedłem, wrócił z symbol @ przekształca się %40

również próbuje:

htmlentities($string) 

zapewnia to ten sam ciąg w prawo.

Używam zestawu znaków UTF8. nie wiem, czy to robi różnicę ....

+0

Ley Usunąłem moją odpowiedź, ponieważ zdałem sobie sprawę, że nie jest dobre. (Dzięki Artefacto) nie jest to jednak wystarczająca ochrona przed botami spamowymi ... –

+0

Jestem świadomy, że nie jest całkowicie niezawodny, jednak w przeszłości korzystałem z tej funkcji, kodując mój adres e-mail za pomocą usług online. Teraz próbuję zbudować go na CMS, który buduję. – Ash

Odpowiedz

39

Tu idzie (zakłada UTF-8, ale to banalne zmianie):

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 Zalecane alternatywy korzystania 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

Nie jest konieczne drukowanie $ cur jako unsigned, gdy konwertowane na ciąg znaków w '$ res. =" & # ". $ cur. ";"; 'ponieważ zakres znaków unicode nie idzie tak daleko. Jeśli jednak masz niepoprawną sekwencję UTF-8, może to dać wartości ujemne (nie wiem, czy mb_convert_encoding sprawdza zakres). – Artefacto

+0

To jest genialna odpowiedź z 3 powodów: 1. Nie mogłem sam o tym pomyśleć. 2. Jest elegancki i działa dobrze. 3. Nauczyłem się z niego wielu dobrych rzeczy. Dzięki. – Ash

8

Znacznie łatwiejszy sposób, aby to zrobić:

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

Możesz zmienić kodowanie, jeśli używasz czegoś innego.

  • Naprawiono zasięg mapy. Dzięki Artefacto.
+0

Miło, nie testowałem, ale przypuszczam, że musisz również zmienić mapę, aby objąć wszystkie znaki Unicode. – Artefacto

+0

prawdopodobnie coś takiego jak '$ convmap = array (0x000000, 0x10ffff, 0, 0xffffff);' (untested) – Artefacto

+0

Konwokacja w tym komentarzu działa: 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; 

} 

powyższa funkcja działa dla 1 znaku, ale jeśli masz ciąg można zrobić, jak to

$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 

} 
Powiązane problemy