PHP删除特殊字符以确保字符串是utf-8编码的

时间:2015-03-16 20:06:24

标签: php utf-8 special-characters

我迷失了如何从字符串中删除特殊字符以确保仅包含uft-8 +法语字符支持的字符。下面的base64字符串有特殊字符,我的清理功能无法删除它们,这导致使用FPDF单元格时不打印文本等。 如果您在https://www.base64decode.org/解码字符串,您将看到特殊字符。

// My sanitizing function
static function remove_none_word_chars($string) {
        return preg_replace('/[^a-zA-Z0-9`_.,;@#%~\’\'\"+*\?\^\[\]\$\(\)\{\}\=!\<\>\|\-:\s\/\\sàâçéèêëîïôûùüÿñæœ]/ui', '', $string);
    }

74KnIFN1cGVydmlzZXIgbGUgdHJhdmFpbCBkZSBs4oCZZW5zZW1ibGUgZHUgcGVyc29ubmVsIGRlIHByb2R1Y3Rpb24sIGRlIGzigJllbnRyZXRpZW4gZXQgZGUgbGEgbWFpbnRlbmFuY2Ugc3VyIGxlIHF1YXJ0IGRlIG51aXQgZW4gdGVuYW50IGNvbXB0ZSBkZSBsYSBjb252ZW50aW9uIGNvbGxlY3RpdmU7Cu+CpyBBc3N1cmVyIHVuZSBib25uZSBnZXN0aW9uIGRlIGzigJllbnNlbWJsZSBkZXMgb3DDqXJhdGlvbnMgZGUgbOKAmXVzaW5lOwrvgqcgUGxhbmlmaWVyIGRlcyBvcMOpcmF0aW9ucyBlbiBmb25jdGlvbiBkZXMgYm9ucyBkZSBjb21tYW5kZTsK74KnIEFwcG9ydGVyIGxlcyBtb2RpZmljYXRpb25zIGV4aWfDqWVzIGxvcnMgZGVzIGRpZmbDqXJlbnRzIGF1ZGl0cyAoR2VuZXJhbCBEeW5hbWljcywgSVNPOTAwMSwgT0hTQVMxODAwMSwgZXRjLik7Cu+CpyBSZW5kcmUgY29tcHRlIGR1IHN1aXZpIGRlcyBvcMOpcmF0aW9ucyDDoCBjaGFxdWUgZGlyZWN0ZXVyIGRlIGTDqXBhcnRlbWVudCBsb3JzIGR1IGNoYW5nZW1lbnQgZGUgcXVhcnQ7Cu+CpyBWb2lyIGF1IHN1aXZpIGRlcyBidWRnZXRzIGV0IGVuIGFzc3VyZXIgbGUgcmVzcGVjdC4=

更新 谢谢所有的答案,上面的功能确实有效,有一个条件声明,我忘了改变其他地方的方式:(令人尴尬。

4 个答案:

答案 0 :(得分:2)

你的功能有效,你只是在传递它之前不解码它。

remove_none_word_chars(base64_decode($string))

一样使用它

答案 1 :(得分:1)

要删除非打印字符,您可以使用正则表达式。

$data= preg_replace('/[^\x0A\x20-\x7E\xC0-\xD6\xD8-\xF6\xF8-\xFF]/','',$data);

// Or to preserve extended characters, use the below expression.
// Mind you many of these may still be non-printing.
$data= preg_replace('/(?!\n)[[:cntrl:]]+/','',$data);

这是answer to a previous question of mineerror_log中删除非打印字符的字符串。

这样做会删除所有不在提供列表中的字符,或者(在第二个示例中)是控制字符。清单:

\x0A = [newline]
\x20-\x7E = [space] ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~
\xC0-\xD6 = À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö
\xD8-\xF6 = Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö
\xF8-\xFF = ø ù ú û ü ý þ ÿ

对于UTF-8的编码,这不应该是一个太大的问题,但有一些可用的功能,如utf8-encode,可能有所帮助。我相信你必须在删除非打印字符之前在字符串上调用它。但请注意,如果字符串不是正确格式的int,或者已经是UTF-8,则可能使字符串不可读。

答案 2 :(得分:0)

这是一种删除非数字和字母字符的方法

static function remove_none_word_chars($string) {
    return preg_replace('~[^\\pL\d]+~u', ' ', $string);
}

查看实际操作:http://3v4l.org/GP31i

答案 3 :(得分:0)

我相信你可以使用这个功能

$test = utf8_encode("your text here");
$new = utf8_decode($test);