2015-09-14 2 views
2

Добрый день!PHP многобайтовый безопасный preg_replace Vs. str_replace

У меня возникли проблемы с preg_replace и utf-8. Следующий код-фрагмент:

$v = "line1\nline2\r\nмы хотели бы поблагодарить"; 
print $v; 
print preg_replace("#\R#", "", $v); 
print preg_replace("\n", "", $v); 

возвращает следующий результат:

line1 
line2 
мы хотели бы поблагодарить 

line1line2мы �отели бы поблагодарить 

line1line2 
мы хотели бы поблагодарить Вас 

По какой-то причине х неразборчивое, когда \R используется, но это не влияет, когда \n используется. Поскольку \R является специфичным для PHP, я полагаю, это порождает проблему. Кто-нибудь знает, как я мог бы использовать \R (что не принято str_replace) в preg_replace? Я боюсь, что эта проблема может произойти во многих других случаях, причем не только с капиталом.

+0

Вы пробовали функцию как utf8decode или кодировали? – Fky

ответ

2

Поскольку у вас есть Unicode вход, вы должны передать /u флаг в регулярное выражение, чтобы иметь дело с входом правильно:

$v = "line1\nline2\r\nмы хотели бы поблагодарить"; 
echo preg_replace('/\R/u', "", $v); 
// => line1line2мы хотели бы поблагодарить 

См IDEONE demo

требуется Это /u флаг, когда оба модели и ввод может содержат строковые литералы Unicode.

Смежные вопросы