PHP获取IP的地理位置都是使用相关函数+正则表达式来获取指定网页中的信息了,下面我整理几个常用的接口与获取方法,有需要了解的朋友可进入参考。
用php file_get_contents 获取ip地址后如何获取地理位置,看下下面代码:
使用file_get_contents和fopen必须空间开启allow_url_fopen。方法:编辑php.ini,设置allow_url_fopen = On,allow_url_fopen关闭时fopen和file_get_contents都不能打开远程文件。
例子
代码如下 |
复制代码 |
function get_ip_place()
{
$ip=file_get_contents("http://fw.qq.com/ipaddress");
$ip=str_replace('"',' ',$ip);
$ip2=explode("(",$ip);
$a=substr($ip2[1],0,-2);
$b=explode(",",$a);
return $b;
}
|
还有一种办法:
来看看
代码如下 |
复制代码 |
function get_ip_arr()
{
$ip=file_get_contents("http://fw.qq.com/ipaddress");
preg_match_all("/"(.*)"/",$ip,$arr);
return $arr;
}
|
返回来的是个数组,里面可以任意去取地区或者是ip
/使用curl:
使用curl必须空间开启curl。方法:windows下修改php.ini,将extension=php_curl.dll前面的分号去掉,而 且需要拷贝ssleay32.dll和libeay32.dll到C:/WINDOWS/system32下;Linux下要安装curl扩展
例子
代码如下 |
复制代码 |
function getIPLoc($queryIP){
$url = 'http://ip.qq.com/cgi-bin/searchip?searchip1='.$queryIP;
$ch = curl_init($url);
curl_setopt($ch,CURLOPT_ENCODING ,'gb2312');
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 获取数据返回
$result = curl_exec($ch);
$result = mb_convert_encoding($result, "utf-8", "gb2312"); // 编码转换,否则乱码
curl_close($ch);
preg_match("@<span>(.*)</span></p>@iU",$result,$ipArray);
$loc = $ipArray[1];
return $loc;
}
|
把html转换成纯文本我们可以使用很多方法,不过最简单的就是使用strip_tags函数,但是还有一些朋友会发现可以使用自定义函数过滤掉,下面整理了一些方法。
将HTML转换为纯文本
有时候可能需要将HTML文本转换为纯文本。可以使用strip_tags()函数达到这个目的,该函数删除字符串中的所有HTML和PHP标记,只剩下文本实体。其形式为:
string strip_tags(string str[,string allowable_tags])
可选的参数allowable_tags指定在此过程中可以跳过的标记。下面的例子使用了strip_tags()删除字符串中的所以HTML标记:
代码如下 |
复制代码 |
$input = "Email example@example.com";
echo strip_tags($input);
?>
这回返回以下结果:
Email example@example.com
下面的例子删除<a>标记之外的所有标记:
$input = "This example
is yanshare!";
echo strip_tags($input, "");
?>
|
返回结果如下:
This example
is yanshare!
PHP版将html中的<br />换行符转换为文本框中的换行符:
代码如下 |
复制代码 |
function br2nl($text){
return preg_replace('/<br\\s*?\/??>/i','',$text);
}
或者:
function br2nl($text){
$text=preg_replace('/<br\\s*?\/??>/i',chr(13),$text);
return preg_replace('/ /i',' ',$text);
}
|
代码如下 |
复制代码 |
<?php
// $document 应包含一个 HTML 文档。
// 本例将去掉 HTML 标记,javascript 代码
// 和空白字符。还会将一些通用的
// HTML 实体转换成相应的文本。
$search = array ("'<script[^>]*?>.*?</script>'si", // 去掉 javascript
"'<[/!]*?[^<>]*?>'si", // 去掉 HTML 标记
"'([rn])[s]+'", // 去掉空白字符
"'&(quot|#34);'i", // 替换 HTML 实体
"'&(amp|#38);'i",
"'&(lt|#60);'i",
"'&(gt|#62);'i",
"'&(nbsp|#160);'i",
"'&(iexcl|#161);'i",
"'&(cent|#162);'i",
"'&(pound|#163);'i",
"'&(copy|#169);'i",
"'&#(d+);'e"); // 作为 PHP 代码运行
$replace = array ("",
"",
"1",
""",
"&",
"<",
">",
" ",
chr(161),
chr(162),
chr(163),
chr(169),
"chr(1)");
$text = preg_replace ($search, $replace, $document);
?>
<?php
$mystr=<<<SATO
此处省略几十行HTML代码^_^
SATO;
$str=strip_tags($mystr);
//到这里就已经达到我的HTML转为TXT文本的目的了,哈哈,使用这个函数真方便
//下面是插件的一些切词等操作,这里就不多说了
?>
|
后来我从网上看到了一个使用PHP写的方法,使用这个方法也可以实现将HTML转为TXT文本,个人觉得也还蛮实用的,在这里分享一下,代码如下:
代码如下 |
复制代码 |
function HtmlToText($str){
$str=preg_replace("/<sty(.*)\/style>|<scr(.*)\/script>|<!--(.*)-->/isU","",$str);//去除CSS样式、JS脚本、HTML注释
$alltext="";//用于保存TXT文本的变量
$start=1;//用于检测<左、>右标签的控制开关
for($i=0;$i<strlen($str);$i++){//遍历经过处理后的字符串中的每一个字符
if(($start==0)&&($str[$i]==">")){//如果检测到>右标签,则使用$start=1;开启截取功能
$start=1;
}else if($start==1){//截取功能
if($str[$i]=="<"){//如果字符是<左标签,则使用<font color='red'>|</font>替换
$start=0;
$alltext.="<font color='red'>|</font>";
}else if(ord($str[$i])>31){//如果字符是ASCII大于31的有效字符,则将字符添加到$alltext变量中
$alltext.=$str[$i];
}
}
}
//下方是去除空格和一些特殊字符的操作
$alltext = str_replace(" "," ",$alltext);
$alltext = preg_replace("/&([^;&]*)(;|&)/","",$alltext);
$alltext = preg_replace("/[ ]+/s"," ",$alltext);
return $alltext;
}
|
使用上面这个方法也可以实现将简答的HTML代码转换为TXT文本
php_sapi_name函数是一个可以返回php所运行的web服务器环境的字符串,下面我们来看两个关于php_sapi_name函数测试出php运行环境的例子。
代码:
<?php
echo php_sapi_name();
?>
在apache环境下面输出的结果是“apache2handler”;
在cgi模式下输出的结果是“cgi-fcgi”
要是在命令行模式下面运行的话,那么输出的结果是:”cli”
如果在nginx中运行就是 nginx字符了。
本例子是使用了file_get_contents()函数来抓取图片内容然后再使用fopen保存到本地服务器了,然后再进行地址url替换这样就实现了一个完整的页面采集功能并保存地址到本地的做法了,下面来看看例子。
首先举个例子吧。 代码如下:
代码如下 |
复制代码 |
<?php
$text=file_get_contents("http://www.111cn.net");
//取得所有img标签,并储存至二维阵列match
preg_match_all('/<[img|IMG].*?src=[\'|\"](.*?(?:[\.gif|\.jpg]))[\'|\"].*?[\/]?>/', $text, $match);
//打印出match
$houzhui = "./tp/".time().rand(10000,50000).".".png;
$yuanname = getImage($match[1][2],$houzhui,tp);
//下载图片方法
function getImage($url,$filename='',$type=0){
if($url==''){return false;}
if($filename==''){
$ext=strrchr($url,'.');
if($ext!='.gif' && $ext!='.jpg'){return false;}
$filename=time().$ext;
}
//文件保存路径
if($type){
$ch=curl_init();
$timeout=5;
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
$img=curl_exec($ch);
curl_close($ch);
}else{
ob_start();
readfile($url);
$img=ob_get_contents();
ob_end_clean();
}
$size=strlen($img);
//文件大小
$fp2=@fopen($filename,'a');
fwrite($fp2,$img);
fclose($fp2);
return $filename;
}
?>
|
案例分析,核心代码如下
代码如下 |
复制代码 |
$text=file_get_contents("http://www.111cn.net");
//取得所有img标签,并储存至二维阵列match
preg_match_all('/<[img|IMG].*?src=[\'|\"](.*?(?:[\.gif|\.jpg]))[\'|\"].*?[\/]?>/', $text, $match);
|
这个正则就是直接获取所有图片不管是http或直接是/aa/aa.gif文件都会自动抓保存到地址了,不过这个会有一些问题图片地址未进行补全了,如我们一个 /a/a/a.gif这样我们是找不到图片的,必须是http://www.111cn.net /a/a/a.gif 这样才可以下载到了,所以我们有必要进行两个处理方法一个是在原基本上处理
代码如下 |
复制代码 |
//文件保存路径
if($type){
$ch=curl_init();
$timeout=5;
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
$img=curl_exec($ch);
curl_close($ch);
|
上面的$url参数进行地址补全,如我采集的是http://www.111cn.net那么地址自动补全为绝对路径了,另一种办法就是使用修改正则表达式
代码如下 |
复制代码 |
preg_match_all("/(src|SRC)=[\"|'| ]{0,}(http:\/\/(.*)\.(gif|jpg|jpeg|png))/isU",$body,$img_array);
|
这样就只获取以http开头的图片文件了哦。
不管是文件还是图片批量上传我们第一个是在html中做name=userfile[]这种数组变量,在php接受中我们做for ($_i=0; $_i<$_cont; $_i++)遍历这样就可以实现文件批量上传了,下面我来看一个实例
例子
代码如下 |
复制代码 |
<?php
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>PHP文件批量上传</title>
<style>
* {margin:0; padding:0; list-style:none;}
.content {width:400px; height:auto; margin:0 auto; margin-top:60px; padding-bottom:30px; background:#ffd3b6; border:dashed 1px #f90}
.content h1 { width:400px; height: 30px; line-height:30px; text-align:center; font-family:"微软雅黑"; font-size:14px; color:#000}
.content .error {width:300px; height:auto; line-height:30px; text-align:center; margin:0 auto; color:#f00}
.content .con {width:340px; height:auto; margin:0 auto; font-size:12px;}
.content #file { width:280px; height:20px; border:solid 1px #ccc; background:#fff; margin:10px 0px 6px 0; font-size:12px;}
.content #send { width:60px; height:22px; border:solid 1px #ccc; background:#fff; font-size:12px; margin-top:10px;}
</style>
<script type="text/javascript"" width=100% src="js/jquery.js"></script>
<script>
$(document).ready(function() {
$('#cont').val($('.file #file').size());
$('#send').eq(0).click(function() {
var filesize=$('.file #file').size();
$('.file').append("<input type='file' name='userfile[]' id='file'/>");
$('#cont').val(filesize+1);
});
});
</script>
</head>
<body>
<div>
<h1>PHP文件批量上传</h1>
<div>
<div>
<?php
if ($_GET['up']==up) {
//防止重复提交
if ($_SESSION['file']==$_GET['irand']) {
$_cont=intval($_POST['cont']); //将file框总数接收并转换成整型
$_size=20000; //设置限制文件大小
$_dir='pdir/'; //文件保存目录
function size($_size) {
//判断文件大小是否大于1024bit 如果大于,则将大小取值为KB,以此类推
if ($_size>1024*1024) {
return round($_size/1024/1024,2).' MB';
}else if ($_size>1024) {
$_size=$_size/1024;
return ceil($_size).'KB';
}else {
return $_size.' bit';
}
}
//设置上传图片的类型,设置图片上传大小
$_upfiles = array('image/jpeg','image/pjpeg','image/png','image/x-png','image/gif');
//利用for循环上传文件
for ($_i=0; $_i<$_cont; $_i++) {
if (is_array($_upfiles)) {
if (!in_array($_FILES['userfile']['type'][$_i],$_upfiles)) {
exit('请上传格式为:jpg,png,gif的文件<br /><a href="pupload.php">返回</a>');
}
}
//判断文件大小
if ($_FILES['userfile']['size'][$_i]>$_size) {
exit('上传文件不能超过:'.size($_size));
}
//检测文件是否已经上传
if ($_FILES['userfile']['error'][$_i]>0) {
switch ($_FILES['userfile']['error'][1]) {
case 1: echo '上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值';
break;
case 2: echo '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值';
break;
case 3: echo '文件只有部分被上传';
break;
case 4: echo '没有文件被上传';
break;
case 6: echo '找不到临时文件夹';
break;
case 7: echo '文件写入失败';
break;
}
exit;
}
//获取文件扩展名
if (!is_dir($_dir)) {
mkdir($_dir,0700);
}
//生成随笔数
$_rand=mt_rand(0,100000);
//获取文件扩展名
$_n=explode('.',$_FILES['userfile']['name'][$_i]); //将文件名分割
$_file_len=count($_n); //返回数组长度
//确保获取的扩展名是最后一个.后面的
$_name=$_dir.time().'_'.$_rand.'.'.$_n[$_file_len-1];
//移动文件到指定的目录
if (is_uploaded_file($_FILES['userfile']['tmp_name'][$_i])) {
if (!@move_uploaded_file($_FILES['userfile']['tmp_name'][$_i],$_name)) {
exit('文件移动失败');
}else {
echo '文件上传成功<br />';
echo '文件路径:'.$_name.'<br />';
echo '文件大小:'.size(filesize($_name));
echo '<br /><a href="pupload.php">返回继续上传</a>';
}
}else {
exit('上传的临时文件不存在,无法将文件移动到指定文件夹');
}
}
//销毁session变量,有几种方法
//第一种,销毁所有session变量:session_destroy();
//第二种:销毁单个如:$_SESSION['file']=''
session_destroy();
exit;
}else {
exit('您已经提交过了,不能重复提交<br /><a href="pupload.php">返回</a>');
}
}
?>
</div>
<?php $_irand=mt_rand(0,1000000); $_SESSION['file']=$_irand; ?>
<form action="?up=up&irand=<?php echo $_irand; ?>" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
<input type="hidden" name="cont" value="" id="cont" />
<div>
<input type="file" name="userfile[]" id="file"/>
<input type="file" name="userfile[]" id="file"/>
<input type="file" name="userfile[]" id="file"/>
<input type="file" name="userfile[]" id="file"/>
</div>
<br />
<input type="button" name="send" value=" 添加一个 " id="send"/>
<input type="submit" name="send" value=" 点击上传 " id="send"/>
</form>
</div>
</div>
</body>
|
核心原理分析
在多文件上传中我们前台最重要的是
代码如下 |
复制代码 |
<input type="file" name="userfile[]" id="file"/>
<input type="file" name="userfile[]" id="file"/>
<input type="file" name="userfile[]" id="file"/>
<input type="file" name="userfile[]" id="file"/>
|
这几行代码有细节的朋友会发现name="userfile[]"了,这个是以数组存储了,这样我们如果使用js也可以这样增加<input type="file" name="userfile[]" id="file"/>就可以了,那么在php是如何获取的呢
在多文件上传中php处理是一个关键
代码如下 |
复制代码 |
for ($_i=0; $_i<$_cont; $_i++) {
if (is_uploaded_file($_FILES['userfile']['tmp_name'][$_i])) {
if (!@move_uploaded_file($_FILES['userfile']['tmp_name'][$_i],$_name)) {
exit('文件移动失败');
}else {
echo '文件上传成功<br />';
echo '文件路径:'.$_name.'<br />';
echo '文件大小:'.size(filesize($_name));
echo '<br /><a href="pupload.php">返回继续上传</a>';
}
}
|
这里显示很简单我们会看到有一个for,for就是遍历数组,遍历userfile[]数组,然后再由$_FILES['userfile']['tmp_name'][$_i]来获取不同文件图片再进行上传即可,注意[$_i]就是你的多文件上传项了,只是保存在了数组中。
标签:[!--infotagslink--]