首先要做的是阅读this解释如何在正则表达式中处理unicode。专门针对 PHP,我们首先需要包含 PCRE 修饰符“u”,以便引擎识别 UTF 字符。所以这将是:
$pattern = "/<our-pattern-here>/u";
接下来要注意的是,在 PHP 中,unicode 字符具有\x{00A0} 模式,其中00A0 是non-breaking space 的十六进制表示。因此,如果我们想用一个空格替换连续的不间断空格,我们将有:
$pattern = "/\x{00A0}+/u";
$new_str = preg_replace($pattern," ",$str);
如果我们要包括 wiki 中提到的其他类型的空间,例如:
-
\x{000D}回车
-
\x{000C}换页
-
\x{0085}下一行
我们的模式变成:
$pattern = "/[\x{00A0}\x{000D}\x{000C}\x{0085}]+/u";
但这真的不是很好,因为正则表达式引擎将花费很长时间来找出这些字符的所有组合。这是因为字符包含在方括号 [ ] 中,并且我们有一个 + 表示出现一次或多次。
获得更快结果的更好方法是首先将所有这些字符的所有出现替换为普通空格。然后用一个普通空格替换多个空格。我们删除 [ ]+ 并使用 or 运算符 | 分隔字符:
$pattern = "/\x{00A0}|\x{000D}|\x{000C}|\x{0085}/u";
$new_str = preg_replace($pattern," ",$str); // we have one-to-one replacement of character by a normal space, so 5 unicode chars give 5 normal spaces
$final_str = preg_replace("/\s+/", " ", $new_str); // multiple normal spaces now become single normal space