如何替换已解码的 Non-breakable space (nbsp)

How to replace decoded Non-breakable space (nbsp)

假设我有一个 "a s d d" 并且 htmlentities 将其变成
"a s d d".

如何在不将其编码为实体的情况下替换(使用 preg_replace)它?

我尝试了 preg_replace('/[\xa0]/', '', $string);,但它不起作用。我试图从我的字符串中删除那些特殊字符,因为我不需要它们

正则表达式之外还有哪些可能性?

编辑 我要解析的字符串:http://pastebin.com/raw/7eNT9sZr
函数 preg_replace('/[\r\n]+/', "[##]", $text)
稍后 implode("</p><p>", explode("[##]", $text))

我的问题不完全是 "how" 执行此操作(因为我可以对实体进行编码、删除我不需要的实体以及对实体进行解码)。但是如何删除那些只有 str_replace 或 preg_replace.

问题说明

它不起作用的原因是您指定的 non-breaking space 不正确。

UTF-8编码中不间断space的正确编码是0xC2A0,它由两个字节组成——0xC2194)和0xA0 (160),所以从技术上讲,您只指定了字符代码的一半。

一点理论知识

旧版字符编码使用固定位数来编码其集合中的每个字符。例如,原来的 ASCII encoding 每个字符使用 7 位,扩展后的 ASCII 为 8 位。

UTF-8编码就是所谓的可变宽度字符编码,意思是用来表示单个字符的位数是可变的,在UTF- 8、字符代码由一个最多四个(8 位)字节(octets)组成。一般而言,与 Huffman 编码 类似,更频繁使用的字符具有更短的代码,而更稀有的字符具有更长的代码。这有助于减少平均文本的数据大小。

解决方案

您可以使用简单(且快速)str_replace 或更灵活的正则表达式替换文本中所有出现的 UTF-8 不间断 space,具体取决于您的需要:

// faster solution
$regular_spaces = str_replace("\xc2\xa0", ' ', $original_string);

// more flexible solution
$regular_spaces = preg_replace('/\xc2\xa0/', ' ', $original_string);

备注

请注意 str_replace 的情况下,您必须使用双引号 (") 将搜索字符串括起来 因为 它不理解字符代码 的文本表示,因此它需要先将这些代码转换为实际字符。这是由 PHP 自动生成的,因为正在处理用双引号引起来的字符串,并且特殊序列(例如换行符 \n、字符代码的文本表示等)被实际字符(例如 0x0A for \n in UTF-8) 在使用字符串值之前。

相比之下,preg_replace 函数本身 理解字符代码的文本表示 因此您不需要 PHP 将它们转换为实际字符在这种情况下,您可以使用撇号(单引号,')将搜索字符串括起来

消毒 every type of white spaces

preg_replace("/\s+/u", " ", $str);

仅供参考,PHP 清理 filter_var() 没有过滤这些空格。