不间断的utf-8 0xc2a0空间和preg_replace奇怪的行为

2021/01/30 18:41 · php ·  · 0评论

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

当我使用

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

它工作正常。

但是当我使用

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

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

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

格式\x{C2A0}正确,我也使用过u标志。

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

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

我已经收集了先前的答案,因此人们可以复制/粘贴以下代码以选择自己喜欢的方法:

$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>';

我认为这两个代码具有不同的作用:第一个代码\xc2\xa0将替换两个字符,\xc2并且\xa0什么也没有。

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

\x{00A0}工作吗?这应该是的表示\xc2\xa0

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

瓦里安的\x{00A0}作品。我没有尝试第二种选择,这是结果:

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

码:

$hex = bin2hex($item);
$_item = str_replace('c2a0', '20', $hex);
$item = hex2bin($_item);

/ \ x {00A0} /,/ \ xC2 \ xA0 /和$ clean_hex2bin-str_replace-bin2hex有效,但无效。如果我将其打印到屏幕上,那一切都很好,但是如果我尝试将其保存到文件中,则该文件将为空白!

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

本文地址:http://php.askforanswer.com/bujianduandeutf-8-0xc2a0kongjianhepreg_replaceqiguaidexingwei.html
文章标签: ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!