非常优秀 PHP JSON解析器程序

 更新时间:2016年11月25日 15:41  点击:2201
JSOND:一个更优的PHP JSON解析器我光说优秀也没有,下面我来给各位演示几个例子吧,这会你看了就知道是不是优秀了哦。

首先,我们先来看看性能测试数据:

 代码如下 复制代码

STR: {"i": 23, "array": [1, null, false, true, ["aha", "baba", 23, {"test": 23}]]}
JSON:  time for 100000 iterations: 0.238321
JSOND: time for 100000 iterations: 0.236436

STR: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
JSON:  time for 100000 iterations: 0.110764
JSOND: time for 100000 iterations: 0.134212

STR: {"a": 23.2234232}
JSON:  time for 100000 iterations: 0.078458
JSOND: time for 100000 iterations: 0.055479

STR: {"long-str": "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.", }
JSON:  time for 100000 iterations: 0.881429
JSOND: time for 100000 iterations: 0.118529

STR: ... json_encode($_SERVER)
JSON:  time for 100000 iterations: 4.341252
JSOND: time for 100000 iterations: 1.960814

可以看到在大数据量的时候jsond的速度比json快多了。

项目地址:

Github:https://github.com/bukka/php-jsond

PECL:http://pecl.php.net/package/jsond

根据自身情况,选择相应的安装方法,安装成功后,查看phpinfo:

 

非常优秀 PHP JSON解析器程序

使用方法:

 代码如下 复制代码

mixed jsond_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] );
string jsond_encode ( mixed $value [, int $options = 0 [, int $depth = 512 ]] );
string jsond_last_error_msg ( void );
int jsond_last_error ( void );

在php中中有自定义函数可以帮我人判断IP地址,也有我们常用的正则函数来判断IP地址,下面我分别来给各位同学总结了验证IP地址的一些方法。

filter函数过滤ip地址的方法:

 代码如下 复制代码

echo filter_var("127.0.0.1","FILTER_VALIDATE_INT"); //返回true or false

例子。

判断是否是合法IP

 代码如下 复制代码

if(filter_var($ip, FILTER_VALIDATE_IP)) {
// it's valid
}
else {
// it's not valid
}

判断是否是合法的公共IPv4地址,192.168.1.1这类的私有IP地址将会排除在外

 代码如下 复制代码
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE)) {
// it's valid
}
else {
// it's not valid
}

判断是否是合法的IPv6地址

 代码如下 复制代码
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)) {
// it's valid
}
else {
// it's not valid
}

判断是否是public IPv4 IP或者是合法的Public IPv6 IP地址

 代码如下 复制代码
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
// it's valid
}
else {
// it's not valid
}

简单的正则

preg_match("/d{1,3}.d{1,3}.d{1,3}.d{1,3}/");// 此方法没不精确,学最大为255.255.255.255 但这个只是验证格式了,如999.999.999.999也可以通过验证。

我们进入升级改进

 代码如下 复制代码

functionis_ip($gonten){ 
$ip=explode(”.”,$gonten); 
for($i=0;$i<count($ip);$i++) 

if($ip[$i]>255){ 
return(0); 


return ereg(”^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$”,$gonten); 
}

这样就符合我们的要求了

再介绍一种用判断ip地址:

 代码如下 复制代码


function matchip($q){
preg_match('/((25[0-5])|(2[0-4]d)|(1dd)|([1-9]d)|d)(.((25[0-5])|(2[0-4]d)|(1dd)|([1-9]d)|d)){3}/', $q, $matches);
return $matches[0];
}

$ipaddress = '201.103.2.2';
$iperror ='262.3.6.6';
$iptest = matchip( $ipaddress );
//当我们给matchip 的值为$ipaddress输出为201.103.2.2
//当我们给matchip的函数值为$iperror时,输出值为 62.3.6.6

if( $iptest )
{
 echo $iptest;
}
else
{
 echo 'www.111cn.net提示:你输的的ip地址有问题';
}

如果我们要判断访问网站的是手机用户还是PC用户我们只要获取用户的HTTP_USER_AGENT即可,我先介绍了一个通用的Mobile_Detect,后面两个例子是自己写的希望对各位有帮助。

php代码

 代码如下 复制代码

//使用实例

include 'Mobile_Detect.php';
$detect = new Mobile_Detect();

// Check for any mobile device.
if ($detect->isMobile())

// Check for any tablet.
if($detect->isTablet())

// Check for any mobile device, excluding tablets.
if ($detect->isMobile() && !$detect->isTablet())

if ($detect->isMobile() && !$detect->isTablet())

// Alternative to $detect->isAndroidOS()
$detect->is('AndroidOS');

// Batch usage
foreach($userAgents as $userAgent){
  $detect->setUserAgent($userAgent);
  $isMobile = $detect->isMobile();
}

// Version check.
$detect->version('iPad'); // 4.3 (float)


php判断手机访问

 代码如下 复制代码

ua = strtolower($_SERVER['HTTP_USER_AGENT']);

$uachar = "/(nokia|sony|ericsson|mot|samsung|sgh|lg|philips|panasonic|alcatel|lenovo|cldc|midp|mobile|wap)/i";

if(($ua == '' || preg_match($uachar, $ua))&& !strpos(strtolower($_SERVER['REQUEST_URI']),'wap'))
{
    $Loaction = 'wap/';

    if (!empty($Loaction))
    {
        ecs_header("Location: $Loactionn");

        exit;
    }

}

 

/** 
* 自定义 header 函数,用于过滤可能出现的安全隐患 

* @param   string  string  内容 

* @return  void 
**/ 
function ecs_header($string, $replace = true, $http_response_code = 0) 

    if (strpos($string, '../upgrade/index.php') === 0) 
    { 
        echo '<script type="text/javascript">window.location.href="' . $string . '";</script>'; 
    } 
    $string = str_replace(array("r", "n"), array('', ''), $string); 
 
    if (preg_match('/^s*location:/is', $string)) 
    { 
        @header($string . "n", $replace); 
 
        exit(); 
    } 
 
    if (emptyempty($http_response_code) || PHP_VERSION < '4.3') 
    { 
        @header($string, $replace); 
    } 
    else   www.111cn.net
    { 
        @header($string, $replace, $http_response_code); 
    } 

js代码

测试代码:

 代码如下 复制代码

var isIPhone = /iPhone/i.test(navigator.userAgent),
 isIPad = /iPad/i.test(navigator.userAgent),
 isAndroid = /android/i.test(navigator.userAgent);
var isIOS = isIPhone  || isIPad;
alert(
 "iPhone? "+isIPhone+"tr"+
 "iPad? "+isIPad+"tr"+
 "Android? "+isAndroid+"tr"+
 "iOS? "+isIOS
);

在PHP中,用你认为最简洁的方法把驼峰样式的字符串转换成下划线样式的字符串。例:输入是FooBar的话,输出则是foo_bar。

自己在看到这个问题的时候,想到的是用ASCII码来处理,没往万能的正则上去想。好吧,下面来看看答案:

答案1:

 代码如下 复制代码

$str = 'OpenAPI';

$length = mb_strlen($str);

$new = '';

for($i = 0; $i < $length; $i++)
{
 $num = ord($str[$i]);
 $pre = ord($str[$i - 1]);

 $new .= ($i != 0 && ($num >= 65 && $num <= 90) && ($pre >= 97 && $pre <= 122)) ? "_{$str[$i]}" : $str[$i];
} www.111cn.net

echo strtolower($new) . '<br>';

答案2:

 代码如下 复制代码

echo strtolower(preg_replace('/((?<=[a-z])(?=[A-Z]))/', '_', $str)).'<br>';

那反过来下划线分割字符串转换成驼峰式字符串怎么搞呢

 代码如下 复制代码

f = new File("d:/temp/t.txt")
if(f.exists()){
    f.eachLine{ line->
        line = line.trim()
        String[] elems = line.split('_')
        for(int i = 0; i < elems.length; i++){
            elems[i] = elems[i].toLowerCase()
            if(i != 0){
                String elem = elems[i]
                char first = elem[0] as char
                elems[i] = "" + (char)(first - 32) + elem.substring(1)
            }
        }
        println elems.join()
    }
}

Php多线程的使用,首先需要PHP5.3以上版本,并安装pthreads PHP扩展,可以使PHP真正的支持多线程,扩展如何安装请自行百度

PHP扩展下载:https://github.com/krakjoe/pthreads

PHP手册文档:http://php.net/manual/zh/book.pthreads.php

在安装好扩展之后,就可以运用多线程了,下面贴个通过搜索结果抓取百度网盘内容的代码:

 代码如下 复制代码

<?php
include 'include/CurlLoad.class.php'; // 引入读取库
/**
 * 多线程抓取内容
 * @param array $url 待抓取URL列表集合
 * @return 成功返回指定内容,失败返回NULL
 */
function vget($url) {
 $ret = BaiduSRLinksGet ( $url, 1 ); // 获取结果列表地址
 if ($ret != null) {
  if (array_key_exists ( "links", $ret )) {
   $infos = array ();
   $number = count ( $ret ['links'] );
   for($i = 0; $i < $number; $i ++) {//循环创建线程对象
    $thread_array [$i] = new baidu_thread_run ( $ret ['links'] [$i] );
    $thread_array [$i]->start ();
   }
   foreach ( $thread_array as $thread_array_key => $thread_array_value ) {//检查线程是否执行结束
    while ( $thread_array [$thread_array_key]->isRunning () ) {
     usleep ( 10 );
    }
    if ($thread_array [$thread_array_key]->join ()) {//如果执行结束,取出结果
     $temp = $thread_array [$thread_array_key]->data;
     if ($temp != null)
      $infos ['res'] [] = $temp;
    }
   }
   $infos ['pages'] = $ret ['pages'];
   $infos ['status'] = "1";
  } else
  $infos = null;
 } else
  $infos = null;
 return $infos;
}
/**
 * 获取百度搜索结果列表URL
 *
 * @param string $url
 *         搜索结果页URL
 * @param int $format
 *         默认$format=0,获取默认地址;$format=1获取跳转后真实地址
 * @return NULL multitype:array()
 */
function BaiduSRLinksGet($url, $format = 0) {
 $html = CurlLoad::HtmlGet ( $url ); // 获取页面
 if ($html == null)
  return null;
 try {
  preg_match_all ( "/"url":"(?<links>.*)"}/", $html, $rets ); // 搜索结果链接筛选
  if (! array_key_exists ( 'links', $rets )) // 如果数组中不包含Links键名,表示获取失败
   return null;
  $ret = array ();
  if ($format == 1) {
   $number = count ( $rets ['links'] );
   for($i = 0; $i < $number; $i ++) {
    $headr_temp = CurlLoad::Get_Headers ( $rets ['links'] [$i], 1 ); // 通过headr获取真实地址
    if (array_key_exists ( "Location", $headr_temp ))
     $ret ['links'] [$i] = $headr_temp ['Location'];
    else
     $ret ['links'] = $rets ['links'];
   }
  } else
   $ret ['links'] = $rets ['links'];
  preg_match_all ( '/href="?/s?wd=site%3Apan.baidu.com%20(?<url>.+?)&ie=utf-8">/', $html, $out );
  unset ( $out ['url'] [0] );
  $number = count ( $out ['url'] );
  for($i = 1; $i < $number; $i ++) {
   preg_match_all ( '/&pn=(.*)/', $out ['url'] [$i], $temp );
   $ret ['pages'] [$temp [1] [0] / 10] = base64_encode ( $out ['url'] [$i] );
  }
  return $ret;
 } catch ( Exception $e ) {
  WriteLog ( $e );
  return null;
 }
}
/**
 * 百度网盘资源信息获取
 *
 * @param string $url
 *         网盘资源页URL
 * @return NULL array
 */
function PanInfoGet($url) {
 $html = CurlLoad::HtmlGet ( $url ); // 获取页面
 if ($html == null)
  return null;
 try {
  if (preg_match_all ( "/文件名:(?<name>.*) 文件大小:(?<size>.*) 分享者:(?<user>.*) 分享时间:(?<date>.*) 下载次数:(?<number>[0-9]+)/", $html, $ret ) == 0)
   return null;
  $rets ['name'] = $ret ['name'] [0];
  $rets ['size'] = $ret ['size'] [0];
  $rets ['user'] = $ret ['user'] [0];
  $rets ['date'] = $ret ['date'] [0];
  $rets ['number'] = $ret ['number'] [0];
  $rets ['link'] = $url;
  return $rets;
 } catch ( Exception $e ) {
  WriteLog ( $e );
  return null;
 }
}
function WriteLog($str) {
 $file = fopen ( "../error.log", "a+" );
 fwrite ( $file, "Warning:" . date ( "Y/m/d H:i:s" ) . ":" . $str . "rn" );
 fclose ( $file );
}
/**
 * 多线程抓取对象
 * @author MuXi
 *
 */
class baidu_thread_run extends Thread {
 public $url;
 public $data;
 public function __construct($url) {
  $this->url = $url;
 }
 public function run() {
  if (($url = $this->url)) {
   $this->data = PanInfoGet ( $url );//线程执行方法
  }
 }
}
?>

[!--infotagslink--]

相关文章

  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • gin 获取post请求的json body操作

    这篇文章主要介绍了gin 获取post请求的json body操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-15
  • 详解Mysql中的JSON系列操作函数

    新版 Mysql 中加入了对 JSON Document 的支持,可以创建 JSON 类型的字段,并有一套函数支持对JSON的查询、修改等操作,下面就实际体验一下...2016-08-23
  • Json格式详解

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成...2021-11-05
  • php常量详细解析

    一、常量常量是一个简单值的标识符(名字)。如同其名称所暗示的,在脚本执行期间该值不能改变(除了所谓的魔术常量,它们其实不是常量)。常量默认为大小写敏感。按照惯例常量标识符总是大写的。 常量名和其它任何 PHP 标签遵循...2015-10-30
  • C#使用Http Post方式传递Json数据字符串调用Web Service

    这篇文章主要为大家详细介绍了C#使用Http Post方式传递Json数据字符串调用Web Service,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • C#使用Process类调用外部exe程序

    本文通过两个示例讲解了一下Process类调用外部应用程序的基本用法,并简单讲解了StartInfo属性,有需要的朋友可以参考一下。...2020-06-25
  • 微信小程序 页面传值详解

    这篇文章主要介绍了微信小程序 页面传值详解的相关资料,需要的朋友可以参考下...2017-03-13
  • JavaScript预解析,对象详解

    这篇文章主要介绍了JavaScript预解析,对象的的相关资料,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助...2021-11-10
  • js遍历json的key和value的实例

    下面小编就为大家带来一篇js遍历json的key和value的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2017-01-26
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • uniapp微信小程序:key失效的解决方法

    这篇文章主要介绍了uniapp微信小程序:key失效的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-20
  • 详解.NET Core 3.0 里新的JSON API

    这篇文章主要介绍了详解.NET Core 3.0 里新的JSON API,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • PHP常用的小程序代码段

    本文实例讲述了PHP常用的小程序代码段。分享给大家供大家参考,具体如下:1.计算两个时间的相差几天$startdate=strtotime("2009-12-09");$enddate=strtotime("2009-12-05");上面的php时间日期函数strtotime已经把字符串...2015-11-24
  • 将c#编写的程序打包成应用程序的实现步骤分享(安装,卸载) 图文

    时常会写用c#一些程序,但如何将他们和photoshop一样的大型软件打成一个压缩包,以便于发布....2020-06-25
  • ASP.NET Core根据环境变量支持多个 appsettings.json配置文件

    这篇文章主要介绍了ASP.NET Core根据环境变量支持多个 appsettings.json配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • 基于Vue+Openlayer实现动态加载geojson的方法

    本文通过实例代码给大家介绍基于Vue+Openlayer实现动态加载geojson的方法,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧...2021-09-01
  • 微信小程序 网络请求(GET请求)详解

    这篇文章主要介绍了微信小程序 网络请求(GET请求)详解的相关资料,需要的朋友可以参考下...2016-11-22
  • 微信小程序如何获取图片宽度与高度

    这篇文章主要给大家介绍了关于微信小程序如何获取图片宽度与高度的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-10