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"c3
和a7
.
您可以告诉正则表达式引擎模式字符串是使用 u
修饰符编码的 utf8。使用此修饰符 ç
不再被视为两个分隔的字节,而是代表一个字符的一组字节。
此代码:
$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"c3
和a7
.
您可以告诉正则表达式引擎模式字符串是使用 u
修饰符编码的 utf8。使用此修饰符 ç
不再被视为两个分隔的字节,而是代表一个字符的一组字节。