Soru PHP, çok bayt güvenli midir?


PHP'de kullanılabilen çok önlü 'preg' işlevleri yoktur, yani varsayılan preg_functions hepsi mb güvenli midir? Php belgelerinde herhangi bir söz bulamadı.


25
2017-11-19 20:58


Menşei


Yüzde C işlevlerinin olduğundan emin olduğumdan% 90 eminim, ama bu benim PHP sürümleri olduğu anlamına gelmez ... - Matthew Scharley


Cevaplar:


PCRE, UTF-8 ve diğer Unicode kodlamalarını destekleyebilir, ancak derleme zamanında belirtilmelidir. İtibaren PCRE 8.0 için man sayfa:

Geçerli PCRE uygulaması, UTF-8 kodlanmış dizgileri ve Unicode genel kategori özellikleri için destek de dahil olmak üzere, yaklaşık olarak Perl 5.10 ile eşdeğerdir. Ancak, UTF-8 ve Unicode desteği açıkça etkinleştirilmelidir; varsayılan değil. Unicode tabloları Unicode sürüm 5.1'e karşılık gelir.

PHP şu anda kullanıyor PCRE 7.9; Sisteminizin eski bir sürümü olabilir.

Bir göz atmak PCRE lib PHP 5.2 ile birlikte geliyor, Unicode özelliklerini ve UTF-8'i destekleyecek şekilde yapılandırılmış görünüyor. İçin aynı 5.3 şube.


25
2017-11-19 21:06



Ben PCRE Sürüm 7.9 içeren PHP 5.3.0 kullanıyorum, UTF8 tanımı içeren PCRE config.h dosyasına baktım, bu yüzden preg_funcs güvenli gibi görünüyor. Bilgi için çok teşekkürler! - Spoonface
Mevcut bir PHP kurulumunun hangi PCRE sürümünü kullandığını belirlemenin hızlı bir yolu var mı? Örneğin sunucum PHP 5.5 kullanıyor, ancak hangi PCRE kütüphanesi ile derlendiğini nasıl anlarım? - thatidiotguy


pcre utf8'i kutudan çıkarır, 'u' değiştiricisinin belgelerine bakın.

Çizim (\ xC3 \ xA4, ute8 Almanca harf "ä" için kodlamadır)

  echo preg_replace('~\w~', '@', "a\xC3\xA4b");

"@ x ¤3" ve "\ xA4" farklı semboller olarak kabul edildiğinden bu yankılanar "@@ ¤ @"

  echo preg_replace('~\w~u', '@', "a\xC3\xA4b");

('u') 'nın "@@@" yazdığına dikkat edin, çünkü "\ xC3 \ xA4" tek bir harf olarak kabul edildi.


26
2017-11-19 21:41



Gerçekten mi? Hmm, regex dizeleriyle aşırı derecede yetkin değilim, eğer düşünmüyorsanız, ne düşündüğünüzü görmek için preg_ kodumun bazılarını gönderebilir miyim? - Spoonface
değiştirici için harika, bunu bilmiyordum - Marco Marsala


Hayır değiller. Soruyu görmek PHP'de preg_match ve UTF-8 Örneğin.


1
2017-11-19 21:03



Açıklığa kavuşturmak için PREG_OFFSET_CAPTURE Karakter ofsetleri yerine bayt ofsetleri üretir. PHP'de string işleme ile tutarlı ama oldukça kafa karıştırıcı olabilir. - Álvaro González


Hayır, kullanmalısın çok baytlı dize fonksiyonları sevmek mb_ereg


1
2017-11-19 21:03



POSIX'in çok baytlı sürümü ereg Bununla birlikte, PCRE ile tam olarak aynı olmayan işlevler preg fonksiyonlar. - mercator
Ben S sen benim kahramanım :) Ben sadece metinleri arındırmak ve äöüß metninde bırakmak istedim. preg_replace bunu hiç doğru yapmadı, ama mb_ereg yapar! - Nibbels
/ u değiştiricisini kullandığınız sürece, çok baytlı kodlama UTF-8 olduğu sürece MULTIBYTE SAFE ARE. / u motoru, UTF-8'den başka herhangi bir kodlamayı desteklemiyor - hanshenrik


Benim daha karmaşık preg fonksiyonlarından bazıları:

(1a) kullanıcı adını alfasayısal + alt çizgi olarak doğrulayın:

preg_match('/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/',$username) 

(1b) olası UTF alternatifi:

preg_match('/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/u',$username) 

(2a) e-postayı doğrulayın:

preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix",$email))

(2b) olası UTF alternatifi:

preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ixu",$email))

(3a) yeni satırları normalleştir:

preg_replace("/(\n){2,}/","\n\n",$str);

(3b) olası UTF alternatifi:

preg_replace("/(\n){2,}/u","\n\n",$str);

Değişiklikler iyi görünüyor mu?


1
2017-11-19 22:21



Tamam o zaman, bilgi için şerefe - Spoonface
E-posta adresinizin normal ifadesinin, e-posta adresinin herhangi bir yerinde '..' olmasına izin vereceğine inanıyorum. Bu, önlenmesi gereken iddialara ihtiyaç duyduğunuz bir şeydir. - Anthony Rutledge