Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 586|回复: 0

php 去除变态空格字符方法,空格trim不掉问题解决思路

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-4-15 19:19:18 | 显示全部楼层 |阅读模式

    前言:今天过滤一段文本,后面有2个空格,用trim去不掉,用preg_match也去不掉,去网上翻阅了无数的方法,终于找到了非常好的一个解决方法。该文章来源于https://my.oschina.net/fffddgx/blog/196376   ,思路是  ,首先将字符分隔开,str_split, 然后循环每个字节查看他的编码,ord();

    trim函数

    以php的trim 函数为例: 去除字符串首尾处的空白字符(或者其他字符)

    string trim    ( string $str   [, string $charlist  ] ) 第二个参数可以指定要trim掉的字符

    如果不指定第二个参数,trim() 将去除这些字符:

    " " (ASCII32(0x20)),普通空格符。   
    "\t" (ASCII9(0x09)),制表符。    
    "\n" (ASCII10(0x0A)),换行符。    
    "\r" (ASCII13(0x0D)),回车符。    
    "\0" (ASCII00x00)),空字节符。    
    "\x0B" (ASCII11(0x0B)),垂直制表符。

    但是空白字符并不只是这些字符。比如全角空格(ascii:227)和一些控制字符,乱码字符等等。全角空格这种情况是比较多的情况,如果确定空白字符是全角空格引起的可以直接

    $value = str_replace("全角空格"," ",$value);

    这样可以解决大部分问题。如果还是解决不了,恭喜你,你越到了变态数据。

    思路

    对于变态数据可以考虑用下面的方法处理

    1、分割字符串,将字符串分割成以一个字节为单位的字符组: str_split($str)

    2、查看空白字符编码。(比如遇到一个变态字符串前面的空格字符是:194 160 194 160,基本可以确定是这个字符的问题)

    3、替换掉空白编码 。比如用正则函数:

    $value = preg_replace("/^[\s\v".chr(194).chr(160)."]+/","", $value); //替换开头空字符
    $value = preg_replace("/[\s\v".chr(194).chr(160)."]+$/","", $value); //替换结尾空字符

    例子

    如下程序:

    //比如字符串: “ abc”(前面是两个全角空格)
    $str = "  abc";
    $sArray = str_split($str);
    foreach ($sArray as $s){
        var_dump(ord($s));
    }

    结果:

    int(227)
    int(128)
    int(128)
    int(227)
    int(128)
    int(128)
    int(97)
    int(98)
    int(99)

    发现a(97)前有2轮

    int(227)
    int(128)
    int(128)

    断定这就是一个utf-8的空白字符,下面的程序去掉这个字符就可以

    $str = preg_replace("/^[\s\v".chr(227).chr(128)."]+/","", $str); //替换开头空字符
    $str = preg_replace("/[\s\v".chr(227).chr(128)."]+$/","", $str); //替换结尾空字符
    
    var_dump($str);

    结果:string(3) "abc",成功去掉该变态空白字符。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-16 22:33 , Processed in 0.080850 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表