2015-09-25 65 views
1

此代码:Preg-replace不删除'§'?

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

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

这只是一个例子,所以我可以制定一个特殊的规则,但我怕它不能删除其他字符。 这是为什么?我如何删除上面列出的所有内容?

+0

尝试''/ [^ \\ s_ @ a-zA-Z0-9äáàëéèíìöóòúùñçÀÁÈÉÊÌÍÒÓÙÚ。,; - ]/u“'。 –

回答

2

您想使用uUnicode)修饰符。通过在正则表达式模式之后放置此修饰符,它指定了PCRE的附加功能,并将模式字符串视为UTF-8

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

您可以修改你的性格类,如下所示:

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

统一财产\pL包括重音的人一起定期a-z字符。 \pN将匹配任何脚本中的任何类型的数字字符;如果需要,您可以将其更改回0-9

1

§(又名:SECTION SIGN)被编码在UTF8与:c2 a7
ç(又名:带下加符拉丁小写字母C)被编码在UTF8与:c3 a7

的正则表达式引擎缺省认为,每个字节是一个字符。如果我写的是这样的:

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

因为否定字符类包含了所有不属于“人物” c3a7我将获得a7

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

+0

非常感谢,现在很清楚。在计算带有特殊字符的字符串长度时,我还发现'mb_strlen'来纠正相同的问题。 – user2502368

+0

@ user2502368:'mb_strlen'确实很有用,但要注意第二个参数是好的编码。 –