假设我有一个刺是 "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 删除它们。
最佳答案
问题说明
它不起作用的原因是您指定了 non-breaking space不正确。
UTF-8 编码中不间断空格的正确代码是 0xC2A0
,它由两个字节组成 - 0xC2
(194
) 和 0xA0
(160
),所以从技术上讲,你重新指定字符代码的一半。
一点理论
传统字符编码使用固定位数来编码其集合中的每个字符。比如原来的ASCII encoding每个字符使用 7 位,扩展 ASCII 8 位。
UTF-8 编码就是所谓的可变宽度字符编码,这意味着用于表示单个字符的位数是可变的,在 UTF-8 的情况下,字符编码包括一到四个(8 位)字节(八位字节)。一般来说,与 Huffman 编码 类似,更频繁使用的字符具有更短的代码,而更罕见的字符具有更长的代码。这有助于减少平均文本的数据大小。
解决方案
您可以使用简单(快速)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);
注意事项
注意在str_replace
的情况下,您必须使用双引号 ("
) 将搜索字符串括起来,因为它不理解字符代码的文本表示,所以它需要这些代码首先转换为实际字符。这是由 PHP 自动生成的,因为正在处理双引号中的字符串并替换特殊序列(例如换行符 \n
,字符代码的文本表示等)在使用字符串值之前按实际字符(例如,0x0A
表示 UTF-8 中的 \n
)。
相比之下,preg_replace
函数本身理解字符代码的文本表示,因此您不需要 PHP 将它们转换为实际字符,您可以使用撇号(单引号,'
)在这种情况下包含搜索字符串。
关于php - 如何替换已解码的 Non-breakable space (nbsp),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40724543/