PHP preg_match ve UTF-8

3 Cevap php

I preg_match kullanarak UTF8 kodlanmış dize aramak için çalışıyorum.

preg_match('/H/u', "\xC2\xA1Hola!", $a_matches, PREG_OFFSET_CAPTURE);
echo $a_matches[0][1];

"H" dizesinde indeksi 1 olduğu için bu, 1 basmalı "¡Hola!". Ama 2 yazdırır. Bir UTF8 kodlanmış bir dize olarak konuyu tedavi değil gibi görünüyor Yani, normal ifadede "u" modifier geçiyorum bile.

Benim php.ini içinde aşağıdaki ayarları vardır, ve diğer UTF8 fonksiyonları çalışıyor:

mbstring.func_overload = 7
mbstring.language = Neutral
mbstring.internal_encoding = UTF-8
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.encoding_translation = Off

Herhangi bir fikir?

3 Cevap

u değiştirici desen değil konu, UTF-8 olarak yorumlanır almak sadece.

Bu güzel bir çözüm değil, ama mb_strlen yerine bayttan UTF-8 karakter uzunluğu almak için deneyin:

$str = "\xC2\xA1Hola!";
preg_match('/H/u', $str, $a_matches, PREG_OFFSET_CAPTURE);
echo mb_strlen(substr($str, 0, $a_matches[0][1]));

Regex önce bu (*UTF8) eklemeyi deneyin:

preg_match('(*UTF8)/H/u', "\xC2\xA1Hola!", $a_matches, PREG_OFFSET_CAPTURE);

Magic, thanks to a comment in http://www.php.net/manual/es/function.preg-match.php#95828

Eğer yapmak istediğiniz tüm H deneyin mb_strpos multi-byte güvenli bir pozisyon bulmak () ise

mb_internal_encoding('UTF-8');
$str = "\xC2\xA1Hola!";
$pos = mb_strpos($str, 'H');
echo $str."\n";
echo $pos."\n";
echo mb_substr($str,$pos,1)."\n";

Çıktı:

¡Hola!
1
H