php数据解析与分隔应用_优品建站

php数据解析与分隔应用

  在项目开发中,难免会对各种数据进行解析分析。要求你抽取出数据的各个组成部分,从而判断整个数据是否满足业务需求,比如以下场景。
  ◆ 对用户填写的URL进行包括域名、路径、查询参数在内等的验证,从而判断它是否满足要求。
  ◆ 从一个路径中抽取出文件扩展名,判断它是否为允许的文件类型。
  ◆ 将一个复杂的URL查询参数转换为数组,以便后面的代码处理。
  ◆ 商品数据表的详情内容中有各种HTML标签,现在仅需要提取其中的文本内容显示在APP商品主页上。
  ◆ 用户从浏览器或者APP端提交的数据中或许有各种HTML标签,尤其是script标签,如果不对其过滤,那么很可能相应的页面一直出现弹窗等。
  除了分析数据外,有时为了减少很多逻辑操作,我们需要将某些字符串用逗号或者分号连接在一起,将其形成一个字符串保存到数据表中。然后取出这些数据的时候,又用同样的连接符号将其分隔为数组,比如以下场景。
  ◆ 添加商品的时候,有正品保障、全国包邮、15天退换等标签,我们需要将这些标签存储进数据表,同时需要将其取出来显示给用户看。
  ◆ 添加商品的时候,有一个幻灯片图列表,大概有3~10张图片,这个时候需要将多张图片存储到数据表中,有需要时再将其取出来显示给用户看。
  本节我们就来解决在以上场景中遇到的问题。
一. 解析URL
  所谓解析URL就是将URL的各个部分抽取出来,包括域名、端口、协议、路径、查询参数等。代码清单5-28所示的就是一个解析URL的例子,运行结果如图5-5所示。

图5-5 代码清单5-28运行结果
代码清单5-28 parse_url_test.php

1. <?php
2. //要解析的URL
3. $url = 'http://www.myself.personsite/parse_url_test.php?test=test&one=one#top';
4. //输出URL的各个组成部分
5. print_r(parse_url($url));
6.
7. //仅输出协议部分
8. echo parse_url($url, PHP_URL_SCHEME) . PHP_EOL;
9. //仅输出主机域名部分
10. echo parse_url($url, PHP_URL_HOST) . PHP_EOL;
11. //仅输出路径部分
12. echo parse_url($url, PHP_URL_PATH) . PHP_EOL;
13. //仅输出查询参数部分
14. echo parse_url($url, PHP_URL_QUERY) . PHP_EOL;
15. //仅输出锚点部分
16. echo parse_url($url, PHP_URL_FRAGMENT);
二. 解析文件路径
  所谓解析文件路径就是将文件路径的各个部分抽取出来,包括目录名、扩展的文件名、文件名、扩展名等。代码清单5-29所示的就是一个解析文件路径的例子,运行结果如图5-6所示。
代码清单5-29 parse_path.php

1.  <?php
2.  $filePath = 'D:\site\img\图5-2.png';
3.  /**
4.    * pathinfo函数:
5.    * 获取指定路径的各个部分
6.    */
7.  print_r(pathinfo($filePath));
8.
9.  //仅获取目录名称
10. echo pathinfo($filePath, PATHINFO_DIRNAME). PHP_EOL;
11. //仅获取文件名 + 扩展
12. echo pathinfo($filePath, PATHINFO_BASENAME) . PHP_EOL;
13. //仅获取文件扩展
14. echo pathinfo($filePath, PATHINFO_EXTENSION) . PHP_EOL;
15. //仅获取文件名
16. echo pathinfo($filePath, PATHINFO_FILENAME);
三. 解析URL查询参数
  所谓解析URL查询参数,就是分析URL中的查询参数情况。代码清单5-30所示的就是一个分析查询参数的例子。
代码清单5-30 parse_url_query.php

1.  <?php
2.  //要解析的查询参数
3.  $queryStr = 'one=one&two=two&three=three&four=four&five=five';
4.
5.  //第一种方法
6.  /**
7.    * explode函数:
8.    * 用指定的字符或者字符串将给定的字符串分割成数组
9.    * 此时$paramArr的结果为
10.  * ['one=one', 'two=two', 'three=three', 'four=four', 'five=five']
11.  */
12. $paramArr = explode('&', $queryStr);
13. $retArr = [];
14. foreach($paramArr as$val) {
15.     $paramItemArr = explode('=', $val);
16.     $retArr[$paramItemArr[0]] = $paramItemArr[1];
17. }
18. print_r($retArr);
19.
20. $retArr = [];
21. //第二种方法
22. /**
23.  * parse_str函数:
24.  * 将查询参数字符串一个个地解析到变量中
25.  */
26. parse_str($queryStr, $retArr);
27. print_r($retArr);
  如代码清单5-30所示,对比两种方法,我们发现虽然explode能够达到目的,但是非常麻烦。而第二种方法,一个PHP内置函数就搞定了,打开浏览器访问http://www.myself. personsite/parse_url_query.php,运行结果如图5-7所示。
图5-7 代码清单5-30运行结果
注意
  parse_str函数的第二个参数是引用传递,即在函数中对该参数修改之后,函数外部也可以访问修改的值,它的函数原型如下:

void parse_str ( string $encoded_string [, array&$result ] )
四. 字符串分隔
  所谓字符串分割就是将字符串以逗号、分号等特殊字符进行分割以成为数组,从而方便程序员进行读取等操作。代码清单5-31所示的就是一个字符串分割的例子。
代码清单5-31 split_str.php

1.  <?php
2.  //商品标签
3.  $goodsTagArr = [
4.      '七天退换货',
5.      '包邮',
6.      '正品保障'
7.  ];
8.  /**
9.    * implode函数:
10.  * 将数组里面的所有元素以某个字符连接起来形成一个字符串
11.  */
12. $goodsTagStr = implode(',', $goodsTagArr);
13. echo $goodsTagStr . PHP_EOL;
14.
15. /**
16.  * explode函数:
17.  * 将字符串以某个字符进行分割以形成一个数组
18.  */
19. $tagArr = explode(',', $goodsTagStr);
20. print_r($tagArr);

  如代码清单5-31所示,我们首先利用内置函数implode生成一个以逗号连接的字符串,然后再用explode函数将字符串分割成数组,运行结果如图5-8所示。

图5-8 代码清单5-31运行结果
提示
  为什么需要将多个字符串以逗号等特殊字符连接起来形成一个字符串?
  有时候我们需要将一些类似用户标签、商品标签等的数据保存到数据表的一个字段中,这些标签可以有多个。所以这个时候,我们就可以将多个标签以逗号或者分号等连接起来形成一个字符串从而方便存储,进而保存到数据表、文件、缓存等中。当从数据表、文件、缓存等中读取数据的时候,我们再将其分割成数组。
五. 过滤HTML标签
  过滤HTML标签就是将字符串中的不合法HTML标签删除掉,仅仅留下合法的标签及内容,这样做的目的是为了避免XSS攻击。代码清单5-32所示的就是一个过滤HTML标签的例子。
代码清单5-32 filter_html.php

1.  <?php
2.  //被过滤的HTML字符串
3.  $htmlStr = <<<HTML
4.  测试测试
5.  <script>alert('哈哈,这是第1次弹窗测试')</script>
6.  测试测试
7.  测试测试
8.  <h1>测试标题</h1>
9.  <script>alert('哈哈,这是第2次弹窗测试')</script>
10. HTML;
11.
12. //echo $htmlStr;
13. /**
14.  * strip_tags函数:
15.  * 将字符串中的所有HTML标签过滤了,仅保留内容
16.  */
17. echo strip_tags($htmlStr);
18. /**
19.  * strip_tags函数:
20.  * 将字符串中的所有HTML标签除h1外都过滤了,仅保留内容
21.  */
22. echo strip_tags($htmlStr, 'h1');
  如代码清单5-32所示,我们用strip_tags内置函数来实现过滤HTML标签,运行结果如图5-9所示。如果去除代码清单5-32中的第12行代码的注释,那么将会弹出一个提示框,效果如图5-10所示。

图5-10 万恶的XSS攻击效果
  如果我们将不过滤的数据保存到数据表里面去,那么显示这个字符串的时候,对应的页面将弹出如图5-10的提示框,也就是所有访问用户都会看到这个提示框,这就是XSS攻击中最常见的一种。
提示
什么是XSS攻击?
  攻击者将一些非法的代码(主要是JavaScript代码)通过各种方式置入到大部分用户都要查看的页面中,这样当用户访问这些页面的时候,就会弹出各种奇怪的东西。攻击者甚至通过对Cookie的控制,会将一些敏感的用户信息上传到第三方平台去。

  • uniapp实现多端开发, PHP写api接口的一些注意事项与安全策略
    市面上很多关于多端开发的框架,比较常用,流行的框架 uni-app,Chameleon(变色龙),taro这些,都可以支持多端,一套代码,8个平台支持。
  • php也是可以做直播相关业务开发的
    如今的直播平台到处都是了,自己动手用PHP去做一个视频直播,那是可以的,你可以用到swoole。但是会花很长时间去开发与测试吧!也不知道开发出来的效果会不会不稳定。
  • 什么是JWT认证,PHP是如何实现JWT认证的?
    JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON方式安全地传输信息。由于此信息是经过数字签名的,因此可以被验证和信任。可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对对JWT进行签名。
  • 统计在线人数,用php如何来实现 ?
    一个业务系统网站每天人数的访问量是多少,在线人数是多少?这种业务我们在开发中就要预留,也是在我们的设计范围内的咯!因为一个正在运营的网站,每天都会用到统计。
  • php中smart_str对比smart_string
    在阐述智能字符串之前,先看看其实现所依赖的基本结构smart_str与smart_string结构体的异同。
  • PHP如何快速导出百万级数据到EXCEL
    如果对于大数集的导出,将要考虑各种性能的问题,这里以导出数据库一百万条数据为例,导出时间不过20秒,值得学习的一种大数据导出方式。
  • PHP上下分页功能的实现过程
    PHP上下分页功能以当前页码为基础,实现上一页和下一页的跳转,并且输出上一页中最后一条数据和下一页中第一条数据的内容。
  • php如何在数组中查找值?
    如果想要查找一个值在数组中的位置,则可以使用array_search()函数进行。
  • PHP的一些安全设置,你都设置过没 ?
    PHP的安全设置包括:1、屏蔽PHP错误输出;2、屏蔽PHP版本;3、关闭全局变量;4、文件系统限制;5、禁止远程资源访问;
  • PHP7的抽象类和接口的介绍及应用
    抽象类和接口都是不能被实例化的特殊类,可以在抽象类和接口中保留公共的方法,将抽象类和接口作为公共的基类。
  • 网站制作 服务

    免费网站制作报价,免费优化,1对1服务,个性化定制服务

    pc和wap网站制作

    多年建站经验,上千个成功案例,
    为您提供一站式服务

    网站维护改版

    大厂经验工程师对现有网站进行
    改版,修复,维护。

    小程序制作

    微信小程序,支付宝小程序,
    百度小程序

    响应式网页设计

    响应式网页设计可以与多种设备兼容,
    如智能手机,平板电脑和PC