Php 如何替换已解码的不易碎空间(nbsp)

Php 如何替换已解码的不易碎空间(nbsp),php,special-characters,htmlspecialchars,Php,Special Characters,Htmlspecialchars,假设我有一个刺是“asdd”,而htmlentities会将它变成 “a s d d” 如何替换(使用preg_replace)它而不将其编码为实体 我尝试了preg_replace('/[\xa0]/','.$string),但它不工作。我正在尝试从字符串中删除这些特殊字符,因为我不需要它们 除了regexp还有什么可能性 编辑 我要分析的字符串: 使用函数preg_replace('/[\r\n]+/',“[##]],$text) 对于以后的内爆(”,分解([##]],$text)) 我的问

假设我有一个刺是
“asdd”
,而
htmlentities
会将它变成
“a s d d”

如何替换(使用preg_replace)它而不将其编码为实体

我尝试了
preg_replace('/[\xa0]/','.$string),但它不工作。我正在尝试从字符串中删除这些特殊字符,因为我不需要它们

除了regexp还有什么可能性

编辑 我要分析的字符串:
使用函数
preg_replace('/[\r\n]+/',“[##]],$text)

对于以后的
内爆(

”,分解([##]],$text))

我的问题并不是如何做到这一点(因为我可以对实体进行编码,删除我不需要的实体并解码实体)。但是,如何移除仅使用str_更换或preg_更换的部件。

问题说明 它不起作用的原因是您错误地指定了

UTF-8编码中非中断空间的正确代码是,它由两个字节组成-
0xC2
194
)和
0xA0
160
),因此从技术上讲,您只指定字符代码的一半

一点理论 传统的字符编码是使用恒定的比特数对其集合中的每个字符进行编码。例如,原始版本每个字符使用7位,扩展ASCII 8位

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

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

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

// more flexible solution
$regular_spaces = preg_replace('/\xc2\xa0/', ' ', $original_string);
笔记 请注意,如果是,则必须使用双引号(
)将搜索字符串括起来
,因为它不理解字符代码的文本表示形式,所以需要先将这些代码转换为实际字符。这是由PHP自动完成的,因为用双引号括起来的字符串正在被处理,并且是特殊序列(例如,换行符
\n
、字符代码的文本表示等)在使用字符串值之前被实际字符替换(例如,UTF-8中
\n
0x0A

相反,函数本身理解字符代码的文本表示形式,因此不需要PHP将其转换为实际字符,在本例中,您可以使用撇号(单引号,
)将搜索字符串括起来


仅供参考,PHP清理没有关于这些空白的过滤器。

htmlentities
是防止xss的措施。如果要在浏览器中渲染,则只将其作为空格进行计算。如果不这样做,则无法使用函数替换空格还是
?@georoot htmlentities可防止错误的HTML输出(也就是说,它确保了信息被释放,而不是数据),XSS只是恶意制作的坏数据。
$string
==
asdd
asdd
?我认为他正在寻找一种方法,从字符串中删除不间断的空格,而不首先将它们转换为HTML实体。注意
str_replace()
也可以,而且速度更快。@simon谢谢,你说得对。添加到我的答案中。我不知道我必须写
\xc2\xa0
并且写了
\xc2a0
…我失败了。谢谢!也许你能告诉我如何在组中替换它吗?
preg_replace('/[\x0E-\x1f]/','.$string);
?@Grzegorz我不知道你说的是什么意思。你是说方括号(
[\xc2\xa0]
)中的代码是一个字符,而不是两个?
preg_replace("/\s+/u", " ", $str);