【问题标题】:PHP remove special characters to make sure a string is utf-8 encodedPHP 删除特殊字符以确保字符串是 utf-8 编码的
【发布时间】:2015-05-19 02:35:57
【问题描述】:

我不知道如何从字符串中删除特殊字符以确保仅包含 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=

更新 谢谢大家的回答,上面的函数确实有效,有一个条件语句我忘了在其他地方改变,那就是:(尴尬。

【问题讨论】:

  • utf-8 有超过一百万个字符
  • 请删除您的问题。

标签: php utf-8 special-characters


【解决方案1】:

您的函数有效,只是在传递字符串之前没有对其进行解码。

remove_none_word_chars(base64_decode($string))一样使用它

【讨论】:

    【解决方案2】:

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

    $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,这可能会使字符串不可读。

    【讨论】:

    • 这可行,但我必须添加 /u $s = preg_replace('/[^\x0A\x20-\x7E\xC0-\xD6\xD8-\xF6\xF8-\xFF]/ u', '', $string)
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      相信你可以使用这个功能

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

      【讨论】:

        猜你喜欢
        • 2013-02-17
        • 2020-09-20
        • 1970-01-01
        • 2014-06-09
        • 1970-01-01
        • 2014-02-14
        • 2011-02-21
        • 1970-01-01
        • 2015-03-12
        相关资源
        最近更新 更多