34

在我的字符串中,我有 utf-8 不间断空格(0xc2a0),我想用其他东西替换它。

当我使用

$str=preg_replace('~\xc2\xa0~', 'X', $str);

它工作正常。

但是当我使用

$str=preg_replace('~\x{C2A0}~siu', 'W', $str);

未找到(并替换)不间断空间。

为什么?第二个正则表达式有什么问题?

格式\x{C2A0}正确,我也使用了uflag。

4

5 回答 5

60

实际上关于 PHP 中转义序列的文档是错误的。当您使用\xc2\xa0语法时,它会搜索 UTF-8 字符。但通过\x{c2a0}语法,它会尝试将 Unicode 序列转换为 UTF-8 编码字符。

不间断空格是U+00A0(Unicode),但编码为C2A0UTF-8。因此,如果您尝试使用该模式~\x{00a0}~siu,它将按预期工作。

于 2012-10-11T11:10:45.167 回答
13

我已经汇总了以前的答案,因此人们只需复制/粘贴以下代码即可选择他们喜欢的方法:

$some_text_with_non_breaking_spaces = "some text with 2 non breaking spaces at the beginning";
echo 'Qty non-breaking space : ' . substr_count($some_text_with_non_breaking_spaces, "\xc2\xa0") . '<br>';
echo $some_text_with_non_breaking_spaces . '<br>';

# Method 1 : regular expression
$clean_text = preg_replace('~\x{00a0}~siu', ' ', $some_text_with_non_breaking_spaces);

# Method 2 : convert to bin -> replace -> convert to hex
$clean_text = hex2bin(str_replace('c2a0', '20', bin2hex($some_text_with_non_breaking_spaces)));

# Method 3 : my favorite
$clean_text = str_replace("\xc2\xa0", " ", $some_text_with_non_breaking_spaces);

echo 'Qty non-breaking space : ' . substr_count($clean_text, "\xc2\xa0"). '<br>';
echo $clean_text . '<br>';
于 2015-05-07T12:42:46.940 回答
3

在我看来,这两个代码做了不同的事情:第一个\xc2\xa0将替换两个字符,\xc2并且\xa0什么都没有。

在 UTF-8 编码中,这恰好是U+00A0.

\x{00A0}行得通吗?这应该是 的表示\xc2\xa0

于 2012-10-11T11:12:00.970 回答
1

我没有使用这个变体~\x{c2a0}~siu

瓦里安\x{00A0}工作。我没有尝试过第二个选项,结果如下:

我试图将其转换为十六进制并将不间断空格替换0xC2 0xA0 (c2a0)为空格0x20 (20)

代码:

$hex = bin2hex($item);
$_item = str_replace('c2a0', '20', $hex);
$item = hex2bin($_item);
于 2014-07-24T08:56:19.090 回答
0

/\x{00A0}/、/\xC2\xA0/ 和 $clean_hex2bin-str_replace-bin2hex 工作和没有工作。如果我把它打印到屏幕上,一切都很好,但如果我试图将它保存到一个文件中,这个文件就会是空白的!

我最终使用了 iconv('UTF-8', 'ISO-8859-1//IGNORE', $str);

于 2018-04-02T02:28:39.047 回答