utf-8 php regex kelime sınır eşleştirme

3 Cevap php

Ben bir utf-8 php dosyasına aşağıdaki php kodu var:

var_dump(setlocale(LC_CTYPE, 'de_DE.utf8', 'German_Germany.utf-8', 'de_DE', 'german'));
var_dump(mb_internal_encoding());
var_dump(mb_internal_encoding('utf-8'));
var_dump(mb_internal_encoding());
var_dump(mb_regex_encoding());
var_dump(mb_regex_encoding('utf-8'));
var_dump(mb_regex_encoding());
var_dump(preg_replace('/\bweiß\b/iu', 'weiss', 'weißbier'));

Ben sadece tam sözcükleri değil deyişle parçaları yerine son regex istiyorum.

Benim windows bilgisayarda, döndürür:

string 'German_Germany.1252' (length=19)
string 'ISO-8859-1' (length=10)
boolean true
string 'UTF-8' (length=5)
string 'EUC-JP' (length=6)
boolean true
string 'UTF-8' (length=5)
string 'weißbier' (length=9)

Web sunucusu (linux), ben alıyorum:

string(10) "de_DE.utf8"
string(10) "ISO-8859-1"
bool(true)
string(5) "UTF-8"
string(10) "ISO-8859-1"
bool(true)
string(5) "UTF-8"
string(9) "weissbier"

Ben windows değil linux üzerinde beklendiği gibi Böylece, regex çalışır.

Yani asıl soru, nasıl ben tek kelime sınırları maç benim regex yazmak gerekir mi?

İkinci bir soru ben windows Benim php uygulama UTF-8 kullanmak istediğinizi bildirin nasıl olduğunu.

3 Cevap

Hatta UTF-8 kipinde, \w ve \b gibi standart sınıf shorthands Unicode farkında değildir. Sen sadece dışarı çalıştı, Unicode Kısaltmalara kullanmak zorunda, ama yerine münavebesinden lookarounds kullanarak biraz daha az çirkin yapabilirsiniz:

/(?<!\pL)weiß(?!\pL)/u

Uyarı de nasıl Unicode sınıf shorthands dışarı küme parantezi sol; sınıf adı, tek bir harfin oluşuyorsa bunu yapabilirsiniz.

Burada şimdiye kadar bulduk budur. Bu gibi arama ve değiştirme desenlerini yeniden yazma:

$before = '(^|[^\p{L}])';
$after = '([^\p{L}]|$)';
var_dump(preg_replace('/'.$before.'weiß'.$after.'/iu', '$1weiss$2', 'weißbier'));
// Test some other cases:
var_dump(preg_replace('/'.$before.'weiß'.$after.'/iu', '$1weiss$2', 'weiß'));
var_dump(preg_replace('/'.$before.'weiß'.$after.'/iu', '$1weiss$2', 'weiß bier'));
var_dump(preg_replace('/'.$before.'weiß'.$after.'/iu', '$1weiss$2', ' weiß'));

Ben istenen sonuç almak:

string 'weißbier' (length=9)
string 'weiss' (length=5)
string 'weiss bier' (length=10)
string ' weiss' (length=6)

benim windows bilgisayar hem apache çalıştıran ve barındırılan web sunucusu linux apache çalıştıran.

Bunu yapmak için biraz daha iyi bir yolu var olduğunu varsayalım.

Ayrıca, ben hala utf-8 benim pencere bilgisayar setlocale istiyorum.

Göre this comment, bu PHP bir hata değildir. \W yerine \b herhangi bir fayda vermek kullanarak mı?