preg_replace与OSX的意外行为

时间:2013-08-25 18:26:20

标签: php regex macos

根据以下代码段,我想知道如何删除多个空格的简单preg_replace如何将字符à转换为问号:

$str = 'nnn      à    nnn     é  nnn';
echo preg_replace('/\s+/', ' ', $str) . "\n";
// outputs 'nnn ? nnn é nnn'

这在使用OSX 10.8.4的Mac上发生。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

奇怪。

$ cat test.php
<?php
$str = '   à   n';
file_put_contents('a.bin',preg_replace('/\s+/', ' ', $str) . "\n");

file_put_contents('b.bin', 'à');

首先,设置一个包含à的测试文件,名为c.bin

$ php test.php 

然后我们将cat文件进行比较:

$ cat b.bin
à$ cat c.bin
à

文件b.binc.bin按预期包含à

$ hexdump -C b.bin 
00000000  c3 a0                                             |..|
00000002
$ hexdump -C c.bin 
00000000  c3 a0 0a                                          |...|
<00000003></00000003>

感谢hexdump,我们可以假设àc3 a0

$ cat a.bin 
 ? n
$ hexdump -C a.bin 
00000000  20 c3 20 6e 0a                                    | . n.|
00000005

在第一个文件a.bin中,没有a0NO-BREAK SPACE)并且重音很难呈现

所以它似乎不是编码错误

编辑: 您可以使用mb_ereg_replace或u修饰符(如HamZa所述):

$ cat test.php 
<?php
$str = 'nnn      à    nnn     é  nnn';
var_dump(preg_replace('/\s+/u', ' ', $str));
var_dump(mb_ereg_replace('\s+', ' ', $str));
$ php test.php 
string(17) "nnn à nnn é nnn"
string(17) "nnn à nnn é nnn"

答案 1 :(得分:0)

您可以使用以下标记在HTML页面中将编码更改为UTF-8:

<meta http-equiv="Content-type" content="text/html; charset=utf-8">

由于您的编码可能存在问题,因此该标记可能会修复它。