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

标签 php special-characters htmlspecialchars

假设我有一个刺是 "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/

相关文章:

PHP/正则表达式 : "linkify" blog titles

java - 当作为参数传递时,在 Java 中正确表示 ^A (Unicode\u0001)

java - java中如何显示特殊字符?

php - htmlspecialchars & ENT_QUOTES 不工作?

php - 清理 PHP/SQL $_POST、$_GET 等...?

php - 提取内容中的简码参数 - Wordpress

php - Symfony Eclipse 中新的 PHP 类命名空间生成

php - Laravel 在主页上显示 index.php 的代码

javascript - TypeScript 调试错误 - 当前未命中断点 - 使用特殊字符时

C++ tolower 特殊字符,如 ü