PHP 删除特殊字符以确保字符串是 utf-8 编码的
PHP remove special characters to make sure a string is utf-8 encoded
我不知道如何从字符串中删除特殊字符以确保只包含 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=
更新
感谢大家的回答,上面的函数确实有效,有一个条件语句我忘了在其他地方改变:(令人尴尬。
你的函数有效,你只是在传递字符串之前没有对其进行解码。
像remove_none_word_chars(base64_decode($string))
一样使用它
这是一种删除非数字和字母字符的方法
static function remove_none_word_chars($string) {
return preg_replace('~[^\pL\d]+~u', ' ', $string);
}
查看实际效果:http://3v4l.org/GP31i
我相信你可以使用这个功能
$test = utf8_encode("your text here");
$new = utf8_decode($test);
要删除非打印字符,您可以使用正则表达式。
$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 mine,用于从发往 error_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,可能会有所帮助。我相信您必须在删除非打印字符之前在字符串上调用它。但是请注意,如果字符串的格式不正确,或者已经是 UTF-8,这可能会使字符串无法读取。
我不知道如何从字符串中删除特殊字符以确保只包含 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=
更新 感谢大家的回答,上面的函数确实有效,有一个条件语句我忘了在其他地方改变:(令人尴尬。
你的函数有效,你只是在传递字符串之前没有对其进行解码。
像remove_none_word_chars(base64_decode($string))
这是一种删除非数字和字母字符的方法
static function remove_none_word_chars($string) {
return preg_replace('~[^\pL\d]+~u', ' ', $string);
}
查看实际效果:http://3v4l.org/GP31i
我相信你可以使用这个功能
$test = utf8_encode("your text here");
$new = utf8_decode($test);
要删除非打印字符,您可以使用正则表达式。
$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 mine,用于从发往 error_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,可能会有所帮助。我相信您必须在删除非打印字符之前在字符串上调用它。但是请注意,如果字符串的格式不正确,或者已经是 UTF-8,这可能会使字符串无法读取。