如何替换解码的不可破断空间 (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))

我的问题并不完全是“如何”做到这一点(因为我可以编码实体,删除我不需要的实体并解码实体)。但是如何删除那些只有str_replace或preg_replace。


答案 1

问题说明

它不起作用的原因是您错误地指定了不间断空格

UTF-8 编码中不换行空格的正确代码0xC2A0,它由两个字节 - () 和 () 组成,因此从技术上讲,您只指定了字符代码的一半。0xC21940xA0160

一点理论

传统字符编码使用恒定的位数对其集合中的每个字符进行编码。例如,原始 ASCII 编码使用每字符 7 位,扩展为 ASCII 8 位。

UTF-8编码是所谓的可变宽度字符编码,这意味着用于表示单个字符的位数是可变的,在UTF-8的情况下,字符代码由一个最多四个(8位)字节(八位字节)组成。通常,与霍夫曼编码类似,更常用的字符具有较短的代码,而较稀有的字符具有较长的代码。这有助于减小平均文本的数据大小。

溶液

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

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

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

笔记

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

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


答案 2

清理各种类型的空白区域

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

https://stackoverflow.com/a/40264711/635364

仅供参考,PHP Sanitization filter_var()没有关于这些空格的过滤器。


推荐