PHP多字节安全preg_replace Vs. str_replace函数

时间:2015-09-14 11:40:00

标签: php regex escaping

美好的一天!

我遇到了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_replacepreg_replace}不接受)?我担心这个问题可能会在许多其他情况下发生,而不仅仅是资本chi。

1 个答案:

答案 0 :(得分:3)

由于您有Unicode输入,因此必须将/u标志传递给正则表达式才能正确处理输入:

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

请参阅IDEONE demo

当模式和输入都包含Unicode字符串文字时,此/u标志是必需的。