$text = preg_replace("/[^\s\-\_\@a-zA-Z0-9äáàëéèíìöóòúùñçÀÁÈÉÊÌÍÒÓÙÚ.,;]/", "", $text);
成功去除特殊字符,如*°+? ECC。我想保存空格,“ - ”,“_”,“@”,字母,数字,重音,“,”,“ - ”和“ç”,没有别的。 它工作正常,但它不能删除此:§
这只是一个例子,所以我可以制定一个特殊的规则,但我怕它不能删除其他字符。 这是为什么?我如何删除上面列出的所有内容?
$text = preg_replace("/[^\s\-\_\@a-zA-Z0-9äáàëéèíìöóòúùñçÀÁÈÉÊÌÍÒÓÙÚ.,;]/", "", $text);
成功去除特殊字符,如*°+? ECC。我想保存空格,“ - ”,“_”,“@”,字母,数字,重音,“,”,“ - ”和“ç”,没有别的。 它工作正常,但它不能删除此:§
这只是一个例子,所以我可以制定一个特殊的规则,但我怕它不能删除其他字符。 这是为什么?我如何删除上面列出的所有内容?
您想使用u
(Unicode)修饰符。通过在正则表达式模式之后放置此修饰符,它指定了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
。
§
(又名:SECTION SIGN)被编码在UTF8与:c2 a7
ç
(又名:带下加符拉丁小写字母C)被编码在UTF8与:c3 a7
的正则表达式引擎缺省认为,每个字节是一个字符。如果我写的是这样的:
echo dechex(ord(preg_replace('~[^ç]~', '', '§')));
因为否定字符类包含了所有不属于“人物” c3
和a7
我将获得a7
。
您可以通过u
修饰符告诉正则表达式引擎模式字符串是utf8编码的。使用此修饰符ç
不再被视为两个分离的字节,而是作为代表一个字符的一组字节。
非常感谢,现在很清楚。在计算带有特殊字符的字符串长度时,我还发现'mb_strlen'来纠正相同的问题。 – user2502368
@ user2502368:'mb_strlen'确实很有用,但要注意第二个参数是好的编码。 –
尝试''/ [^ \\ s_ @ a-zA-Z0-9äáàëéèíìöóòúùñçÀÁÈÉÊÌÍÒÓÙÚ。,; - ]/u“'。 –