如何替换已解码的 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
,它由两个字节组成——0xC2
(194
)和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() 没有过滤这些空格。
假设我有一个 "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
,它由两个字节组成——0xC2
(194
)和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() 没有过滤这些空格。