代码:
$text = preg_replace("/[^'s'-'_'@a-zA-Z0-9äáàëéèíìöóòúùñçÀÁÈÉÊÌÍÒÓÙÚ.,;]/", "", $text);
成功删除特殊字符,如*°+?ecc。我想保存空格,"-","_","@",字母,数字,重音,"。,;","ñ"answers"ç",没有其他。它工作得很好,但它不能删除这个:§
这只是一个例子,所以我可以制定一个特殊的规则,但我担心它不能删除其他字符。为什么呢?我怎样才能完全删除我上面列出的所有内容?
您希望使用u
(Unicode)修饰符。通过将此修饰符放在正则表达式模式之后,它指定了PCRE的附加功能,并且模式字符串被视为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
§
(又名:SECTION SIGN)用utf8编码:c2 a7
ç
(又名:拉丁小写字母C WITH CEDILLA)用utf8编码:c3 a7
regex引擎默认认为每个字节是一个字符。如果我这样写:
echo dechex(ord(preg_replace('~[^ç]~', '', '§')));
我将获得a7
,因为否定的字符类包含所有不是"字符"c3
和a7
。
您可以告诉regex引擎模式字符串是使用u
修饰符进行utf8编码的。有了这个修饰符,ç
不再被视为两个分开的字节,而是作为一个字符的一组字节。