繁体   English   中英

Preg-replace不删除'§'?

[英]Preg-replace not removing '§'?

这段代码:

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

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

这只是一个例子,所以我可以制定一个特殊规则,但我担心它也不能删除其他字符。 这是为什么? 我怎样才能完全删除上面列出的所有内容?

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

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

您可以按如下方式修改角色类:

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

Unicode属性\\pL包括常规az字符和重音字符。 \\pN将匹配任何脚本中的任何数字字符; 如果需要,可以将其更改回0-9

§ (又名:SECTION SIGN)用utf8编码: c2 a7
ç (又名:带有CEDILLA的LATIN SMALL LETTER C)在utf8中编码: c3 a7

正则表达式引擎默认情况下认为每个字节都是一个字符。 如果我写这样的东西:

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

我将获得a7因为否定的字符类包含所有不是“字符” c3a7

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM