此代码:
$text = preg_replace("/[^\s\-\_\@a-zA-Z0-9äáàëéèíìöóòúùñçÀÁÈÉÊÌÍÒÓÙÚ.,;]/", "", $text);
成功删除*°+等特殊字符? ECC。我想保存空格,“ - ”,“_”,“@”,字母,数字,重音符号,“。,;”,“ñ”和“ç”,没有别的。 它工作正常,但不能删除它:§
这只是一个例子,所以我可以制定一个特殊规则,但我担心它也无法删除其他字符。 这是为什么?我怎样才能完全删除上面列出的所有内容?
答案 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
,因为否定的字符类包含所有不是"字符" c3
和a7
。
您可以告诉正则表达式引擎模式字符串是使用u
修饰符进行utf8编码的。使用此修饰符ç
不再被视为两个分隔的字节,而是一组代表一个字符的字节。