假设我有一个"a s d d"
的字符串,而htmlentities
将其变成"a s d d"
。
如何替换(使用preg_replace)而不将其编码为实体?
我尝试了preg_replace('/[\xa0]/', '', $string);
,但是没有用。我正在尝试从字符串中删除那些特殊字符,因为我不需要它们
regexp之外还有什么可能?
编辑
我想解析的字符串:http://pastebin.com/raw/7eNT9sZr
具有功能preg_replace('/[\r\n]+/', "[##]", $text)
以后的implode("</p><p>", explode("[##]", $text))
我的问题不完全是“如何”做到这一点(因为我可以编码实体,删除不需要的实体并解码实体)。但是,如何仅使用str_replace或preg_replace删除它们。
最佳答案
问题是您以错误的方式指定了non-breakable space。 UTF-8编码中不可中断空间的正确代码是0xC2A0
,它由两个字节组成-C2
(194
)和A0
(160
),您只指定了字符代码的一半。
您可以根据需要使用简单(快速)的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自动完成的,因为正在处理双引号中包含的字符串,并且在字符串之前将特殊序列(例如换行符\n
,字符代码的文本表示等)替换为实际字符(例如,UTF-8中的0x0A
的\n
)值被使用。相比之下,
preg_replace
函数本身可以理解字符代码的文本表示形式,因此在这种情况下,不需要PHP将它们转换为实际字符,并且可以使用撇号(单引号,'
)将搜索字符串括起来。UTF-8编码称为可变宽度字符编码,这意味着字符代码由一个至多四个(8位)字节组成。通常,使用频率较高的字符具有较短的代码,而较多的奇异字符具有较长的代码。
关于php - 如何替换已解码的不可破坏空间(nbsp),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40724543/