2012-05-12 7 views
5

Estoy tratando de detectar emoji en mi código php, y evitar que los usuarios lo ingresen.php find emoji [actualizar el código existente]

El código que tengo es:

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

Pero no funciona para todos los emoji. ¿Algunas ideas?

Respuesta

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

que realmente quieres para que coincida con Unicode a un nivel de personaje, en lugar de tratar de hacer un seguimiento de UTF-8 secuencias de bytes . Use el modificador u para tratar su cadena UTF-8 en base a caracteres.

Los emoji están codificados en el bloque U + 1F300-U + 1F5FF. Sin embargo:

  • muchos personajes de portaaviones japoneses sets ‘’ emoji están ocupadas con símbolos Unicode existentes, por ejemplo, los juegos de la tarjeta, los signos del zodiaco y algunas flechas. ¿Cuenta estos símbolos como 'emoji' ahora?

  • Todavía hay sistemas que no utilizan los puntos de código emoji Unicode recién estandarizados, en su lugar utilizan rangos ad-hoc en el Área de uso privado. Cada proveedor tenía sus propias codificaciones. iOS 4 usó el conjunto de Softbank. More info. Es posible que desee bloquear toda el área de uso privado.

por ejemplo:

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

Hola, gracias por esa idea, pero no funciona para todos los emoji:) ¿Hay alguna manera de agregar soporte para este: ❤? ¿Y probablemente algunos otros? Funciona perfectamente para iOS emoji ahora. Gracias. – Kukosk

+2

Bueno, esa es la pregunta de qué cuentas como emoji. ❤ existía como un símbolo general mucho antes de que alguien concibiera emoji. Si desea bloquear solo los símbolos que se han reutilizado para emoji, mire el enlace de Emoji para PHP anterior y seleccione todos los puntos de código U + 2xxx utilizados. Alternativamente, considere bloquear un rango más amplio de símbolos si no los necesita, por ejemplo 'unichr (0x2190) .'- '. Unichr (0x27FF)'. – bobince

+0

gracias Bobince :) – Kukosk

2

de Wikipedia:

El emoji conjunto básico como de Unicode 6.0 consta de 722 caracteres, de que 114 caracteres se asignan a secuencias de uno o más caracteres en el pre 6,0-estándar Unicode, y el los restantes 608 caracteres se asignan a secuencias de uno o más caracteres introducidos en Unicode 6.0. [4] No hay un bloque específicamente reservado para emoji: los nuevos símbolos se codificaron en siete bloques diferentes (algunos recién creados), y existe existe un archivo de datos Unicode llamado EmojiSources.txt que incluye las asignaciones desde y hacia los proveedores japoneses ' juegos de personajes heredados

Aquí está el mapping file. Hay 722 líneas en el archivo, cada una representando uno de los 722 emoticones.

Parece que esto no es algo fácil de hacer porque no hay un bloque específico reservado para emoji. Necesita ajustar su expresión regular para cubrir todos los emoji unicodes.

puede hacer una coincidencia Unicode un individuo de esta manera:

\x{1F30F} 

1F30F es el Unicode para un emoticono de un globo.

Lo siento, no tengo una respuesta completa para usted, pero esto debería llevarlo en la dirección correcta.

1

La respuesta correcta es detectar dónde tiene un punto de código asignado en el bloque Miscellaneous_Symbols_And_Pictographs. En Perl, que tendría que utilizar

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

o simplemente

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

que se debe combinar en un solo aquellos con el patrón de

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

No recuerdo si la biblioteca PCRE que PHP uses le da acceso a las propiedades de caracteres Unicode requeridas. Mi recuerdo es que es bastante débil en esa área en particular. Creo que solo tiene propiedades de script Unicode y categorías generales. Suspiro.

A veces solo tiene que usar el producto real.

Por falta de soporte Unicode decente, puede que tenga que enumerar el bloque de sí mismo:

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

Parece una pesadilla de mantenimiento para mí, lleno de números mágicos.

+0

Seguence es demasiado grande en el offset 19 :( – Kukosk

+0

@Kukosk no tengo ni idea de lo que esto podría significar Es un rango legal no se puede especificar el rango emoji como '../[\ x {1F300} - \ x {1F5FF}] /] '? – tchrist

+0

funciona ahora ... pero no reconoce todos los emojis :(Cuando uso los que están en iOS 'Emoji' Keyboard, no detectarlos ... – Kukosk

-2

Eso es lo que se me ocurrió hoy.Probablemente no es una buena solución para este problema, pero al menos funciona;)

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

*** Estás en Microsoft ???? *** Ese es probablemente el error: Microsoft tiene muchos problemas con Unicode, especialmente con el rango Unicode completo que necesitarías para manejar emoji, ya que esos están fuera del BMP. Deberías h ave puso ** WINDOWS ** en las etiquetas. ¿No podría simplemente usar un sistema Unix normal en su lugar? Los Mac son baratos cuando se tiene en cuenta el cumplimiento de los estándares, que es lo que se necesita aquí. Linux es incluso más barato. – tchrist

+0

Estoy en un mac;) – Kukosk

+0

Descubrí que no es una buena 'solución' ... No funciona para £, y algunos otros caracteres ... – Kukosk

Cuestiones relacionadas