2012-05-12 28 views
5

php kodumda emoji'yi tespit etmeye ve kullanıcıların onu girmesini engellemeye çalışıyorum.php emoji [mevcut kodu güncelle]

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

Ama bütün emoji için çalışmıyor:

Ben koddur. Herhangi bir fikir? Wikipedia`dan

cevap

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

Gerçekten ziyade UTF-8 bayt dizilerinin takip etmek için çalışmak yerine, bir karakter düzeyinde Unicode eşleştirmek istediğiniz . UTF-8 dizginizi karakter bazında işlemek için u değiştiricisini kullanın.

Emoji, U + 1F300 – U + 1F5FF bloğunda kodlanmıştır. Ancak: den

  • birçok karakter Japon taşıyıcılar ‘emojisi’ setleri aslında var olan Unicode sembolleri eşlenir, örneğin kart takım elbise, zodyak işaretleri ve bazı oklar. Bu sembolleri şimdi "emoji" olarak değerlendiriyor musunuz? Özel Kullanım Alanı'nda geçici aralıklar kullanmak yerine, yeni standartlaştırılmış Unicode emoji kod noktalarını kullanmayan sistemler hala vardır. Her taşıyıcının kendi kodlamaları vardı. iOS 4, Softbank setini kullandı. More info. Tüm Özel Kullanım Alanını engellemek isteyebilirsiniz.

örn.:.

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

Merhaba, bu fikir için teşekkür ederim, ama tüm emoji için işe yaramaz:) Bunun için destek eklemenin bir yolu var mı: ❤? Ve muhtemelen başkaları? Artık iOS emoji için mükemmel çalışıyor. Teşekkür ederim. – Kukosk

+2

İşte bu, emoji olarak saydığınız şeyin sorusu. ❤ emoji'yi düşünmeden çok önce genel bir sembol olarak varlığını sürdürdü. Eğer sadece emoji için yeniden kullanılmış olan sembolleri engellemek istiyorsanız, yukarıdaki Emoji For PHP bağlantısına bakın ve kullanılan tüm U + 2xxx kod noktalarını seçin. Alternatif olarak, bunlara ihtiyacınız yoksa daha geniş bir sembol aralığını engellemeyi düşünebilirsiniz, örneğin, 'unichr (0x2190) .'-'. Unichr (0x27FF) '. – bobince

+0

Teşekkür ederim bobince :) – Kukosk

2

:

Unicode 6.0 olarak ayarlanmış çekirdek ister ifade 722 karakterlerden oluşan 114 karakter ön 6.0 Unicode standardı bir veya daha fazla karakter dizisi eşlemek , ve kalan 608 karakter, Unicode 6.0'da tanıtılan bir veya daha fazla karakterin dizisine eşlenir. [4] Emoji için özel olarak ayarlanmış bir blok yoktur - yeni semboller yedi farklı blokta kodlanmıştır (bazı yeni oluşturulanlar) ve , Japon satıcılarına eşlemelerini içeren EmojiSources.txt adlı bir Unicode veri dosyası içerir. eski karakter kümeleri.

İşte mapping file. Dosyada her biri 722 ifadeden birini temsil eden 722 satır var.

Yapılması kolay bir şey değil gibi görünüyor çünkü emoji için kenara ayrılmış özel bir blok yok. Tüm emoji unicodes'larını kapsayacak şekilde normal ifadenizi ayarlamanız gerekir.

Öyle gibi bireysel bir unicode maç olabilir:

\x{1F30F} 

1F30F bir kürenin bir ifade için Unicode olduğunu.

Üzgünüz, sizin için tam bir cevabım yok, ama bu sizi doğru yöne yönlendirmeli.

1

Doğru yanıt, Miscellaneous_Symbols_And_Pictographs satırında atanmış kod noktanızın nerede olduğunu saptamaktır. Perl, sen ben hatırlamıyorum

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

veya

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

ile bir kalıp içine o birleştirmek gerektiği

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

kullanmayı tercih ediyorum PCRE kütüphanesi o PHP olmadığını kullanır, gerekli Unicode karakter özelliklerine erişmenizi sağlar. Anımsaması o bölgede oldukça zayıf. Bence sadece Unicode betiği özelliklerine ve genel kategorilere sahipsiniz. İç çekmek.

Bazen sadece gerçek şeyi kullanmanız gerekir.

iyi Unicode desteği eksikliği için, blok olabilir kendinizi numaralandırma gerekebilir:

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

sihirli sayıların tam bana bakım kabus gibi görünüyor.

+0

Düzeni azından ben anlamına gelebilir hiçbir fikrim yok 19 :( – Kukosk

+0

@Kukosk ofset Yasal bir aralık var değil 'olarak emojisi aralığını belirtebilir miyim çok büyük/[\ x {1F300} - \ x {1F5FF}] /] '? – tchrist

+0

şimdi çalışıyor ... ama tüm emojileri tanımıyor :(iOS 'Emoji' Keyboard'da olanları kullandığımda onları algılar ... – Kukosk

-2

Bugün bunlarla geldim.Muhtemelen bu sorun için iyi bir çözüm değil, ama en azından çalışır;)

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

*** Microsoft'un üzerindesiniz ???? *** Muhtemelen hata şu: Microsoft Unicode'la, özellikle de emoji işlemek için gereksinim duyacağınız tam Unicode ürün yelpazesiyle ilgili pek çok sorun var. BMP'nin dışındalar. ave ** WINDOWS ** etiketlerine koydu. Bunun yerine normal bir Unix sistemi kullanmadınız mı? Mac'ler standartlara uyum sağladığınızda ucuzdur, bu da burada ihtiyacınız olan şeydir. Linux daha da ucuzdur. – tchrist

+0

Bir macdayım;) – Kukosk

+0

Bunun iyi bir 'geçici çözüm' olmadığını öğrendim ... £ ve diğer bazı karakterler için çalışmıyor ... – Kukosk