2013-07-29 8 views
5

jest jakiś prosty sposób na obcięcie chińskich znaków Okazało się, że wyrażenie regularne, ale to nie działa zgodnie z oczekiwaniamiJak usunąć chińskich znaków w ciąg

<?php 
$data1='疯狂的管道Test'; 
$data2='睡眠帮手-背景乐Test'; 

echo str_replace(preg_replace("/[^\x{4e00}-\x{9fa5}]+/u", '', $data1),'',$data1) 
."<br>\n". 
str_replace(preg_replace("/[^\x{4e00}-\x{9fa5}]+/u", '', $data2),'',$data2); 
exit; 

działa dla danych1 ale nie dane2

Odpowiedz

6

Spróbuj tego kodu (online version @ Ideone.com):

<?php 
$data1='疯狂的管道Test'; 
$data2='睡眠帮手-背景乐Test'; 

echo preg_replace("/[\x{4e00}-\x{9fa5}]+/u", '', $data1), "\n"; 
echo preg_replace("/[\x{4e00}-\x{9fa5}]+/u", '', $data2); 

// Better use this (credits to Kobi's answer below) 
preg_replace("/\p{Han}+/u", '', $data) 

mam usunięte ^ z wyrażenia regularnego więc nie musimy str_replace() już.

Twoje stare wyrażenie regularne pasowało do wszystkich znaków innych niż chińskie, dzięki czemu preg_replace() pozostało tylko chińskie znaki w zwracanym łańcuchu. Aby uzyskać końcowy wynik, musisz zastąpić znalezione chińskie znaki pustym ciągiem.

preg_replace("/[^\x{4e00}-\x{9fa5}]+/u", '', $data1) // returns 疯狂的管道 
str_replace('疯狂的管道', '', $data1); // gives us Test 

Drugie wyrażenie regularne ponownie pasuje do wszystkich znaków innych niż chińskie. Ale teraz są one nie w sekwencji!

preg_replace("/[^\x{4e00}-\x{9fa5}]+/u", '', $data2) // returns 睡眠帮手背景乐 

I ten ciąg nie można znaleźć w $data2 już zatem nie działa.

0

Ten powinien również wykonać zadanie
/[^\u4E00-\u9FFF]+/

+0

Wyrażenie regularne nie jest rzeczywisty problem. Problem polega na tym, że dopasowanie drugiego regexp nie reprezentuje sekwencji w oryginalnym łańcuchu, który można zastąpić. – ComFreek

+0

Przez "nie" pasuje - masz na myśli "-" w drugim var? – ToastedCrack

+0

Nie bardzo rozumiem twoje pytanie. Jeśli ** wszystkie ** chińskie znaki w drugim wyrażeniu byłyby następujące po sobie, to by działało. – ComFreek

Powiązane problemy