2012-05-12 14 views
5

Sto provando a rilevare le emoji nel mio codice php e impedisco agli utenti di inserirle.php find emoji [aggiornamento codice esistente]

Il codice che ho è:

if(preg_match('/\xEE[\x80-\xBF][\x80-\xBF]|\xEF[\x81-\x83][\x80-\xBF]/', $value) > 0) 
{ 
    //warning... 
} 

ma non funziona per tutti emoji. Qualche idea?

risposta

10
if(preg_match('/\xEE[\x80-\xBF][\x80-\xBF]|\xEF[\x81-\x83][\x80-\xBF]/', $value) 

davvero si vuole abbinare Unicode ad un livello del personaggio, piuttosto che cercare di tenere traccia di UTF-8 sequenze di byte . Utilizzare il modificatore u per trattare la stringa UTF-8 in base ai caratteri.

Le emoji sono codificate nel blocco U + 1F300-U + 1F5FF. Tuttavia:

  • molti personaggi di vettori giapponesi set ‘emoji’ sono in realtà mappati simboli Unicode esistenti, ad esempio, i semi delle carte, segni zodiacali e alcune frecce. Contate questi simboli come "emoji" adesso?

  • ci sono ancora sistemi che non utilizzano i punti di codice emoji Unicode appena standardizzati, utilizzando invece intervalli ad-hoc nell'Area di uso privato. Ogni vettore aveva le proprie codifiche. iOS 4 usava il set di Softbank. More info. Potrebbe essere necessario bloccare l'intera area di utilizzo privato.

esempio:

function unichr($i) { 
    return iconv('UCS-4LE', 'UTF-8', pack('V', $i)); 
} 

if (preg_match('/['. 
    unichr(0x1F300).'-'.unichr(0x1F5FF). 
    unichr(0xE000).'-'.unichr(0xF8FF). 
']/u'), $value) { 
    ... 
} 
+0

Ciao, grazie per quell'idea, ma non funziona per tutte le emoji:) C'è un modo per aggiungere supporto per questo: ❤? E probabilmente alcuni altri? Funziona perfettamente per le emoji iOS ora. Grazie. – Kukosk

+2

Bene, questa è la domanda su ciò che contate come emoji. ❤ esisteva come simbolo generale molto prima che qualcuno concepisse le emoji. Se vuoi bloccare solo i simboli che sono stati riutilizzati per le emoji, guarda il link Emoji per PHP sopra e scegli tutti i punti di codice U + 2xxx usati. In alternativa, considera il blocco di un intervallo più ampio di simboli se non ne hai bisogno, ad esempio 'unichr (0x2190) .'- '. Unichr (0x27FF)'. – bobince

+0

grazie bobince :) – Kukosk

2

Da wikipedia:

L'emoji nucleo impostato come Unicode 6.0 consiste di 722 caratteri, di che 114 caratteri mappano sequenze di una o più caratteri nel pre 6.0 standard Unicode, e la i rimanenti 608 caratteri sono mappati alle sequenze di uno o più caratteri introdotti in Unicode 6.0. [4] Non esiste un blocco specifico per le emoji - i nuovi simboli sono stati codificati in sette blocchi diversi (alcuni di recente creati) e c'è un file di dati Unicode chiamato EmojiSources.txt che include i mapping da e verso i fornitori giapponesi ' set di caratteri legacy.

Ecco lo mapping file. Ci sono 722 linee nel file, ognuna delle quali rappresenta una delle emoticon 722.

Sembra che questa non sia una cosa facile da fare perché non esiste un blocco specifico riservato alle emoji. Devi regolare la tua espressione regolare per coprire tutti gli unjiodi di emoji.

Si poteva competere con un unicode individuo in questo modo:

\x{1F30F} 

1F30F è l'Unicode per un emoticon di un globo.

Spiacente, non ho una risposta completa per te, ma questo dovrebbe portarti nella giusta direzione.

1

La risposta corretta è individuare il punto di codice assegnato nel blocco Miscellaneous_Symbols_And_Pictographs. In Perl, utilizza

/\p{Assigned}/ && \p{block=Miscellaneous_Symbols_And_Pictographs}/ 

o semplicemente

/\P{Cn}/ && /\p{Miscellaneous_Symbols_And_Pictographs}/ 

che si dovrebbe combinare quelle in un modello con

/(?=\p{Assigned})\p{Miscellaneous_Symbols_And_Pictographs}/ 

Non ricordo se la libreria PCRE che PHP usi consente di accedere alle proprietà dei caratteri Unicode richieste. Il mio ricordo è che è piuttosto debole in quella particolare area. Penso che tu abbia solo le proprietà degli script Unicode e le categorie generali. Sospiro.

A volte devi solo usare la cosa reale.

Per mancanza di supporto Unicode decente, potrebbe essere necessario elencare il blocco da soli:

/(?=\P{Cn})[\x{1F300}-\x{1F5FF}]/ 

Sembra un incubo di manutenzione per me, pieno di numeri magici.

+0

Seguence è troppo grande all'offset 19 :( – Kukosk

+0

@Kukosk Non ho idea di che cosa ciò possa significare Si tratta di una gamma legale Non è possibile specificare l'intervallo di emoji come '../[\ x {1F300} - \ x {1F5FF}] /] '? – tchrist

+0

funziona ora ... ma non riconosce tutti gli emoji :(Quando uso quelli su iOS 'Emoji' Keyboard, non lo fa li rilevi ... – Kukosk

-2

Questo è quello che mi è venuto in mente oggi.Probabilmente non è una buona soluzione per questo problema, ma almeno funziona;)

if(iconv('Windows-1250', 'UTF-8', iconv('UTF-8', 'Windows-1250', $value)) != $value) 
+3

*** Sei su Microsoft ???? *** Probabilmente è un bug: Microsoft ha molti problemi con Unicode, specialmente l'intera gamma Unicode di cui hai bisogno per gestire emoji, dal momento che quelli sono al di fuori del BMP. Dovresti h ave mettere ** WINDOWS ** nei tag. Non potresti semplicemente usare un normale sistema Unix? I Mac costano poco quando si tiene conto della conformità degli standard, che è ciò di cui si ha bisogno qui. Linux è ancora più economico. – tchrist

+0

Sono su un mac;) – Kukosk

+0

Ho scoperto che non è una buona "soluzione" ... Non funziona per £ e alcuni altri caratteri ... – Kukosk