p>在我的字符串中,我有utf-8不间断空格(0xc2a0),我想用别的东西替换它./p>
p>当我使用/ p>时
pre> code> $ str = preg_replace('? xc2 xa0~','X',$ str);
/代码>/ PRE>
它运作正常./p>
但是当我使用/ p>时
pre> code> $ str = preg_replace('? x {C2A0} ~siu','W',$ str);
/代码>/ PRE>
p>未找到(并替换)不间断的空间./ p>
P>为什么呢? 第二个regexp有什么问题?/ p>
p>格式代码> x {C2A0} / code>是正确的,我还使用了代码> u / code> flag./p>
可能是因为代码> $ str / code>不是unicode字符串。
实际上,关于PHP中的转义序列的文档是错误的。当您使用代码> xc2 xa0 / code>语法时,它会搜索UTF-8字符。但是使用代码> x {c2a0} / code>语法,它会尝试将Unicode序列转换为UTF-8编码的字符./p>
p>非中断空格是代码> U + 00A0 / code>(Unicode),但在UTF-8中编码为代码> C2A0 / code>。因此,如果您尝试使用模式代码>? x {00a0} ~siu / code>,它将按预期工作./p>
是的, x工作,谢谢。
嗨纽博。 你的回答对我有用,但我仍然不明白为什么。 是因为我的不是UTF-8吗? 我的数据来自具有utf8_general_ci字符集的数据库表,因此它应该是UTF-8(我的character_set_client和character_set_connection也是UTF-8)。 你有链接了解更多信息吗? 谢谢。
a href ="http://rrn.dk/the-difference-between-utf-8-and-unicode">本文/ a>非常了解这个主题。 还有一个href ="http://stackoverflow.com/questions/3951722/whats-the-difference-between-unicode-and-utf8">这个SO问题/ a>前一篇文章已被复制/粘贴。
我已经开始研究以前的答案,以便人们可以复制/粘贴以下代码来选择他们喜欢的方法:/ p>
pre> code> $ some_text_with_non_breaking_spaces ="sometextwith开头有2个非破坏空格";
echo'Qty non-breaking space:'。 substr_count($ some_text_with_non_breaking_spaces," xc2 xa0")。 'BR>';
echo $ some_text_with_non_breaking_spaces。 'BR>';
#方法1:正则表达式
$ clean_text = preg_replace('? x {00a0} ~siu','',$ some_text_with_non_breaking_spaces);
#方法2:转换为bin - > replace - >转换为hex
$ clean_text = hex2bin(str_replace('c2a0','20',bin2hex($ some_text_with_non_breaking_spaces)));
#方法3:我最喜欢的
$ 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>';
/代码> / PRE>
代码> hex2bin()/ code>变量是危险的,它将错误地替换错误对齐的出现。 例如,考虑十六进制序列代码> 0c2a0a / code>。
p>在我看来,这两个代码做了不同的事情:第一个代码> xc2 xa0 / code>将替换两个字符,代码> xc2 / code>和代码> xa0 / code> with nothing./p>
p>在UTF-8编码中,这恰好是代码> U + 00A0 / code>的代码点./ p>
p>代码> x {00A0} / code>有效吗?这应该是代码> xc2 xa0 / code> ./ p>的表示
x工作,谢谢。
p>我没有使用这个变体代码>? x {c2a0} ~siu / code> ./ p>
p> Varian代码> x} / code>有效。我没有尝试过第二个选项,结果如下:/ p>
p>我试图将其转换为十六进制并将无中断空格代码> 0xC2 0xA0(c2a0)/ code>替换为空格代码> 0x20(20)/ code> ./ p>
P>代码:/ P>
pre> code> $ hex = bin2hex($ item);
$ _item = str_replace('c2a0','20',$ hex);
$ item = hex2bin($ _ item);
/代码> / PRE>
谢谢,工作......
p> / x {00A0} /,/ xC2 xA0 /和$ clean_hex2bin-str_replace-bin2hex工作并且不起作用。如果我把它打印到屏幕上,这一切都很好,但是如果我试图将它保存到文件中,那么该文件将是空白的!/ p>
p>我最终使用了iconv('UTF-8','ISO-8859-1 // IGNORE',$ str); / p>