Preg-replace 不删除'§'?

Preg-replace not removing '§'?

此代码:

$text = preg_replace("/[^\s\-\_\@a-zA-Z0-9äáàëéèíìöóòúùñçÀÁÈÉÊÌÍÒÓÙÚ.,;]/", "", $text);

是否成功删除了 *°+ 等特殊字符? ECC。我想保存空格、“-”、“_”、“@”、字母、数字、重音符号、“.、;”、“ñ”和“ç”,没有别的。 它工作正常,但它不能删除这个:§

这只是一个例子,所以我可以制定一个特殊的规则,但恐怕它也不能删除其他字符。 这是为什么?我怎样才能完全删除不是我上面列出的所有内容?

您想使用 u (Unicode) 修饰符。通过将此修饰符放在正则表达式模式之后,它指定了 PCRE 的附加功能,并且模式字符串被视为 UTF-8.

$text = preg_replace('/[^a-zA-Z0-9äáàëéèíìöóòúùñçÀÁÈÉÊÌÍÒÓÙÚ\s@.,;_-]/u', '', $text);

您可以按如下方式修改您的角色class:

$text = preg_replace('/[^\pL\pN\s.,;@_-]+/u', '', $text);

Unicode属性\pL 包括常规 a-z 字符和重音字符。 \pN 将匹配任何脚本中的任何类型的数字字符;如果需要,您可以将其改回 0-9

§(又名:SECTION SIGN)在 utf8 中编码为:c2 a7
ç(又名:带有 CEDILLA 的拉丁文小写字母 C)在 utf8 中编码为:c3 a7

正则表达式引擎默认认为每个字节都是一个字符。如果我这样写:

echo dechex(ord(preg_replace('~[^ç]~', '', '§')));

我会得到a7因为否定字符class包含所有不是"characters"c3a7.

您可以告诉正则表达式引擎模式字符串是使用 u 修饰符编码的 utf8。使用此修饰符 ç 不再被视为两个分隔的字节,而是代表一个字符的一组字节。