Preg-replace not removing '§'?


Preg-replace not removing '§'?

代码:

$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,因为否定的字符类包含所有不是"字符"c3a7

您可以告诉regex引擎模式字符串是使用u修饰符进行utf8编码的。有了这个修饰符,ç不再被视为两个分开的字节,而是作为一个字符的一组字节。