Preg-replace不删除'§'?

时间:2015-09-25 16:55:34

标签: php regex preg-replace special-characters

此代码:

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:1)

§(又名:SECTION SIGN)在utf8中编码:c2 a7
ç(又名:带有CEDILLA的LATIN SMALL LETTER C)在utf8中编码:c3 a7

正则表达式引擎默认情况下会考虑每个字节都是一个字符。如果我写这样的话:

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

我将获得a7,因为否定的字符类包含所有不是"字符" c3a7

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