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

10-13 01:13