先来看问题
file_get_contents不能获取带端口的网址
例如:
代码如下 | 复制代码 |
file_get_contents('http://localhost:12345'); |
没有任何获取。
解决方法是 :关闭selinux
1 永久方法 – 需要重启服务器
修改/etc/selinux/config文件中设置SELINUX=disabled ,然后重启服务器。
2 临时方法 – 设置系统参数
使用命令setenforce 0
附:
setenforce 1 设置SELinux 成为enforcing模式
setenforce 0 设置SELinux 成为permissive模式
file_get_contents超时
代码如下 | 复制代码 |
function _file_get_contents($url) } |
好了上面的问题得到解决之后我们可以开始采集了。
代码如下 | 复制代码 |
<?php //全国,判断条件是$REQUEST_URI是否含有html if (!strpos($_SERVER["REQUEST_URI"],".html")) { $page="http://qq.ip138.com/weather/"; $html = file_get_contents($page,'r'); $pattern="/<B>全国主要城市、县当天和未来五天天气趋势预报在线查询</B>(.*?)<center style="padding:3px">/si"; //正则匹配之间的html preg_match($pattern,$html,$pg); echo ""; //正则替换远程地址为本地地址 $p=preg_replace('//weather/(w+)/index.htm/', 'tq.php/$1.html', $pg[1]); echo $p; } //省,判断条件是$REQUEST_URI是否含有? else if(!strpos($_SERVER["REQUEST_URI"],"?")){ //yoyo推荐的使用分割获得数据,这里是获得省份名称 $province=explode("/",$_SERVER["REQUEST_URI"]); $province=explode(".",$province[count($province)-1]); $province=$province[0]; //被注释掉的是我自己写出来的正则,感觉写的不好,但效果等同上面 //preg_match('/[^/]+[.(html)]$/',$_SERVER["REQUEST_URI"],$pro); //$province=preg_replace('/.html/','',$pro[0]); $page="http://qq.ip138.com/weather/".$province."/index.htm"; //获取html数据之前先尝试打开页面,防止恶意输入地址导致出错 if (!@fopen($page, "r")) { die("对不起,该地址不存在!<a href=javascript:history.back(1)>点击这里返回</a>"); exit(0); } $html = file_get_contents($page,'r'); $pattern="/五天天气趋势预报</B>(.*?)请输入输入市/si"; preg_match($pattern,$html,$pg); echo ""; //正则替换,获取省份,城市 $p=preg_replace('//weather/(w+)/(w+).htm/', '$2.html?pro=$1', $pg[1]); echo $p; } else { //市,通过get传递省份 $pro=$_REQUEST['pro']; $city=explode("/",$_SERVER["REQUEST_URI"]); $city=explode(".",$city[count($city)-1]); $city=$city[0]; //preg_match('/[^/]+[.(html)]+[?]/',$_SERVER["REQUEST_URI"],$cit); //$city=preg_replace('/.html?/','',$cit[0]); $page="http://qq.ip138.com/weather/".$pro."/".$city.".htm"; if (!@fopen($page, "r")) { die("对不起,该地址不存在!<a href=javascript:history.back(1)>点击这里返回</a>"); exit(0); } $html = file_get_contents($page,'r'); $pattern="/五天天气趋势预报</B>(.*?)请输入输入市/si"; preg_match($pattern,$html,$pg); echo ""; //获取真实的图片地址 $p=preg_replace('//image//', 'http://qq.ip138.com/image/', $pg[1]); echo $p; } ?> |
如果上面办法无法采集到数据我们可以使用来处理
代码如下 | 复制代码 |
<?php $url = "http://www.111cn.net "; $ch = curl_init(); $timeout = 5; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); //在需要用户检测的网页里需要增加下面两行 //curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); //curl_setopt($ch, CURLOPT_USERPWD, US_NAME.":".US_PWD); $contents = curl_exec($ch); curl_close($ch); echo $contents; ?> |
Session是什么
Session是指有始有终的一系列动作或信息,比如去看电影从进入影院到走出影院的整个过程可以称为一个Session。Cookie将数据存储在客户端计算机上,而Session将不定量的变量存储在服务器端。
每一个用户链接网站服务器后便会产生一个Session,所以首先要告诉服务器使用Session功能来存储数据。启用Session功能的方式有两种:
1、使用session_start()函数启动会话,其结构形式如下:
session_start()
函数不能带参数,其返回值为布尔型。
2、在php.ini中设置参数 session.auto_start,将此参数设为1,即当有连接到服务器后Session功能将自动启用。
启动Session后,在使用Session变量之前首先要注册变量,之后才能使用,反之不使用某个变量时就要取消注册。Session_register(变量名)可以注册一个Session变量;Session_unregister(变量名)可以取消注册一个Session变量,例如:
代码如下 | 复制代码 |
session_start(); /* 启动session变量 */ |
调用session变量
php session使用方法:用函数$_SESSION[]可以创建一个函数变量,其格式如下:
代码如下 | 复制代码 |
$_SESSION['$string']=$str; |
参数$string是要定义的变量名,$str是变量值。在调用时使用$_SESSION[$string]的格式。
实例:
代码如下 | 复制代码 |
<?php |
session的使用
本站前面介绍了session的一些概念以及基本操作,这里通过实例介绍php session使用的方法。
实例代码:
代码如下 | 复制代码 |
<?php |
session.php代码:
代码如下 | 复制代码 |
<?php session_start(); echo "用户名是:" .$_COOKIE['name'] ."<br>"; echo "密码是:" .$_SESSION['password'] ."<br>"; echo "访问时间是:" .date('Y m d H:i:s', $_SESSION['time']) ."<br>"; ?> |
获取session_id的值
每一个session都有会被指定一个特定的id,用session_id来标识。我们可以通过session_id()函数查看当前session_id的值,其结构形式如下:
session_id()
实例:
代码如下 | 复制代码 |
<?php |
cookie与session的区别
session和cookie都是重要的会话管理应用,在许多的php开发项目都会用到。它们的作用是能够给不同的用户创建不同的值,从而让不同的用户返回的结果都不相同。
那么session cookie区别在哪里呢?
cookie是利用客户端来创建,当用户用浏览器打开网站时就会给用户创建一个cookie,这个过程是由用户的电脑执行的,网站的服务器只是发送一些指令。因此如果用户禁止了cookie功能,则无法利用cookie来实现相关功能。
session则是利用服务端来创建,整个过程都由服务器来执行,用户无权干预。
在运用时,如果你希望节约服务器的资源,可以选用cookie来进行会话管理;如果你希望所有的浏览者都能使用会话管理,则应该选用session。
静态页面中看上去好你是不能直接调用php文件了,但是有可以使用js调用方式来调用php文件,当然还可以使用ajax 调用php文件哦,下面我来给大家介绍举一个简单的例子来说明:
如在页面a.html中用下面这句调用,可以将action=test的参数传递到b.php。
Javascript代码
代码如下 | 复制代码 |
<script type="text/javascript"" width=100% src="b.php?action=test"></script> |
在b.php中有这样一段PHP代码:
PHP代码
代码如下 | 复制代码 |
<? $action=$_GET['action']; |
当执行a.html文件时,就会调用b.php文件,并将b.php文件的输出作为JS语句来执行,内容为JS传递的参数action的值,也就是在PHP文件中接受过来的action的值.
jquery的load函数是请求另一个文件并加载到当前DOM里的调用
1、加载一个php文件,该php文件不含传递参数
代码如下 | 复制代码 |
$("#myID").load("test.php"); |
2、加载一个php文件,该php文件含有一个传递参数
代码如下 | 复制代码 |
$("#myID").load("test.php",{"name" : "Adam"}); |
3. 加载一个php文件,该php文件含有多个传递参数。注:参数间用逗号分隔
代码如下 | 复制代码 |
$("#myID").load("test.php",{"name" : "Adam" ,"site":www.111cn.net}); //导入的php文件含有一个传递参数,类似于:test.php?name=Adam&site=www.111cn.net |
4. 加载一个php文件,该php文件以数组作为传递参数
代码如下 | 复制代码 |
$("#myID").load("test.php",{‘myinfo[]‘, ["Adam", www.111cn.net}); |
在php遍历数组有三个函数foreach、each、list & each下面我们看它们是如何遍历多维数组的。
先看一个遍历二维数组
代码如下 | 复制代码 |
<?php |
下面看遍历三维数组
例1
代码如下 | 复制代码 |
function arr_fun($arr){ |
例2
代码如下 | 复制代码 |
<?php 输出结果 Array |
利用list与each遍历二维数组
代码如下 | 复制代码 |
<?php while (list($key, $value) = each($sports)) { |
在php中来判断字符串是否为中文,就会沿袭这个思路:
代码如下 | 复制代码 |
<?php $str = "php编程"; if (preg_match("/^[u4e00-u9fa5]+$/",$str)) { print("该字符串全部是中文"); } else { print("该字符串不全部是中文"); } ?> |
不过,很快就会发现,php并不支持这样的表达,报错:
Warning: preg_match() [function.preg-match]: Compilation failed: PCRE does not support L, l, N, U,
or u at offset 3 in test.php on line 3
刚开始从google上查了很多次,想从php正则表达式对于十六进制数据的
表达方式上进行突破,发现在php中,是用x表示十六进制数据的。于是,
变换成如下的代码:
代码如下 | 复制代码 |
$str = "php编程"; if (preg_match("/^[x4e00-x9fa5]+$/",$str)) { print("该字符串全部是中文"); } else { print("该字符串不全部是中文"); } |
貌似不报错了,判断的结果也正确,不过把$str换成“编程”两字,结果却还是显示“该字符串不全部是中文”,看
来这样的判断还是不够准确。
如果要精准匹配中文,即匹配纯中文字符,或匹配中文字符加上全角标点,则需要根据不同编码环境使用不同方法。
下面以两种常用的编码(gb2312,utf-8)
下面给两个例子:
代码如下 | 复制代码 |
(1) ANSI编程环境下: $strtest = “yyg中文字符yyg”; $pregstr = "/([".chr(0xb0)."-".chr(0xf7)."][".chr(0xa1)."-".chr(0xfe)."])+/i"; if(preg_match($pregstr,$strtest,$matchArray)){ echo $matchArray[0]; } //output:中文字符 (2) Utf-8编程环境下: $strtest = “yyg中文字符yyg”; $pregstr = "/[x{4e00}-x{9fa5}]+/u"; if(preg_match($pregstr,$strtest,$matchArray)){ echo $matchArray[0]; } //output:中文字符 |