假设我有一个"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的那些。
答案 0 :(得分:21)
问题是您以错误的方式指定了不可破坏的UTF-8空间。正确的代码是0xc2a0
,您只需指定字符代码的一半。
您可以使用简单(快速)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
,字符代码等)。
相比之下,preg_replace
函数本身了解原始字符代码,因此您不需要PHP将代码转换为实际字符,您可以使用撇号(单引号'
)用于包含搜索字符串。
注意如何将UTF-8字符代码指定为两个单独的数字。
答案 1 :(得分:3)
preg_replace("/\s+/u", " ", $str);
https://stackoverflow.com/a/40264711/635364
仅供参考,PHP清理filter_var()没有关于这些空白的过滤器。