2010-06-09 11 views
15

voglio convertire questo [email protected] aCome convertire tutti i caratteri della loro entità HTML equivalente utilizzando PHP

hello@domain.com 

ho provato:

url_encode($string) 

Questo fornisce la stessa stringa sono entrato, ritornò con il simbolo @ convertito in %40

anche provato:

htmlentities($string) 

questo fornisce la stessa stringa indietro.

Sto utilizzando un set di caratteri UTF8. non so se questo fa la differenza ....

+0

ley ho cancellato la mia risposta, perché ho capito che non va bene. (Grazie Artefacto) tuttavia, questa non è una protezione sufficiente contro i robot spam ... –

+0

Sono consapevole che non è completamente infallibile, tuttavia ho avuto buoni risultati usando questa funzione in passato, codificando il mio indirizzo email usando i servizi online. Ora sto provando a costruirlo in un CMS che sto costruendo. – Ash

risposta

39

qui va (assume UTF-8, ma è banale di cambiamento):

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 alternativa consigliata utilizzando 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

Bello. --------- –

+0

Non è necessario stampare $ cur come unsigned quando si converte in una stringa in '$ res. =" & # ". $ cur. ";"; 'perché la gamma di caratteri unicode non arriva così lontano. Tuttavia, se si ha una sequenza UTF-8 non valida, ciò potrebbe dare valori negativi (non so se mb_convert_encoding convalida l'intervallo). – Artefacto

+0

Questa è una risposta brillante per 3 motivi: 1. Non avrei potuto pensarci da solo. 2. È elegante e funziona bene, 3. Ho imparato molte cose buone da esso. Grazie. – Ash

8

modo molto più semplice per fare questo:

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

È possibile modificare la codifica se si utilizza qualcosa di diverso.

  • Intervallo di mappa fisso. Grazie a Artefacto.
+0

Bello, non ho provato, ma suppongo che devi anche cambiare la mappa per coprire tutti i caratteri Unicode. – Artefacto

+0

probabilmente qualcosa come '$ convmap = array (0x000000, 0x10ffff, 0, 0xffffff);' (non testato) – Artefacto

+0

La convmap in questo commento funziona: 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 funzione di cui sopra lavora per 1 carattere, ma se si dispone di una stringa si può fare in questo modo

$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 

} 
Problemi correlati