php提取字符串中网站url地址程序代码

 更新时间:2016年11月25日 17:22  点击:1911
今天写一个问答系统上线之后发现有很多人发连接了,由于业务部门要我们过滤掉网站地址了,下面我给大家分享一个提取字符串url地址函数

例子

 代码如下 复制代码

$postInfo['answer2'] ='可以的,商业贷款可摊还36%,公积金贷款可摊还16%|||可以先把账户里的余额提取出来用作首付,然后每个月贷款商业贷款可摊还36%,公积金贷款可摊还16%|||可以的,现在甲类公积金是摊还比例http://www.111cn.net是工资基数的34%|||啊啊啊啊啊啊啊啊是的|||可以摊还,甲类34%
';

preg_match_all("/http:[\/]{2}[a-z]+[.]{1}[a-z\d\-]+[.]{1}[a-z\d]*[\/]*[A-Za-z\d]*[\/]*[A-Za-z\d]*/",$postInfo['answer2'],$array2);

print_r($array2);
 
if(!empty($array2[0]))
{
 foreach ($array2[0] as $k=>$v){
  $postInfo['answer2'] = str_replace($array2[0][$k],'',$postInfo['answer2'] );
 }
}

结果就为

(
    [0] => Array
        (
            [0] => http://www.111cn.net
        )

)

关于直接采集远程机器图片之后再下载到我们本地其实非常的简单,我们通常会使用fopen 与 file_put_contents 或者高级点的curl来实现,下面我整理了几个比较好用的图片下载到本地例子,大家一起看看。

对于没有防盗链的图片

 代码如下 复制代码

/*
 * 对于没有防盗链的图片
 * $url 图片地址
 * $filename 图片保存地址
 * return 返回下载的图片路径和名称,图片大小
 */
function GrabImage($url,$filepath,$filename="") {
if($url=="") return false;
 
$ext=strrchr($url,".");
if($filename=="") {
if($ext!=".gif" && $ext!=".jpg" && $ext!=".png") return false;
$filename=date("YmdHis");
}
 
ob_start();
readfile($url);
$img = ob_get_contents();
ob_end_clean();
$size = strlen($img); // 图片大小
 
!is_dir(getcwd().$filepath)? mkdir(getcwd().$filepath):null;//生成文件夹
 
$fp2=fopen(getcwd().$filepath.$filename.$ext, "a");
fwrite($fp2,$img);
fclose($fp2);
 
return array($filepath.$filename.$ext,$size);
}
 


有防盗链的图片
 

 代码如下 复制代码
/*
* 有防盗链的图片
* $url 图片地址
* $filename 图片保存地址
* return 返回下载的图片路径和名称,图片大小
* $fromurl 来源URL,填写来源图片网址可破解防盗链
*/
function GrabImage2($url,$filepath,$filename="",$fromurl) {
 if($url=="") return false;
 
$ext=strrchr($url,".");
 if($filename=="") {
 if($ext!=".gif" && $ext!=".jpg" && $ext!=".png") return false;
 $filename=date("YmdHis");
 }
 
!is_dir(getcwd().$filepath)? mkdir(getcwd().$filepath):null;//生成文件夹
 
 $re = $this->curlg($url,$fromurl);
 $size = file_put_contents(getcwd().$filepath.$filename.$ext,$re);//返回大小
 
 return array($filepath.$filename.$ext,$size);
}

批量采集代码:

 代码如下 复制代码
/**
* 批量下载图片
*/
public function downimg(){
$keep = $this->_get("keep");//1从缓存获取2删除缓存/重新缓存
$id = $this->_get("id");
$id = $id?$id:0;
$nextid = $id+1;
if($keep!=1){
$data = M('Cjlist')->where("status=1")->select();
S("keepcjdata",$data,3600);
}else{
$data = S("keepcjdata");
}
$endid= count($data);
//echo $id;
//echo $endid;
if($endid==$id){
exit('所有图片下载完成!');
}
//echo $endid;
$data2['cover_imgurl'] = $this->imgdown2($data[$id]['cover_imgurl']);
//echo $data[$id]['thum_url'];
$data2['thum_url'] = $this->imgdown2($data[$id]['thum_url'],'thum_');//中型图片type
$data2['id']=$data[$id]['id'];
if(!$data2['thum_url'] || !$data2['cover_imgurl']){
$data2['status']=-1;
}else{
$data2['status']=2;
}
$res = M('Cjlist')->save($data2);
//$this->echosql();
if($res){
echo '下载完成ID:'.$data2['id']." 前往下一个ID下载<script>window.location.href='".U('Index/downimg')."/keep/1/id/".$nextid."'</script>";
}else{
echo '保存出错,正在重试刷新。<script>window.location.reload()</script>';
}
//dump($data2);
//dump($data);
 
}

同时还可以生成缩略图哦

 代码如下 复制代码

/*
 *图片采集保存本地生成缩略图
 *
 * */
 
 public function imgdown($picurl='http://p0.so.qhimg.com/t0129f40df5810dfaa5.jpg',$fromurl='http://image.so.com'){
 $mulu = "/".date("YmdH",time())."/";
 $reimg = $this->GrabImage2($picurl,$mulu,time(),$fromurl);
 //$img = file_get_contents($picurl);
 //echo file_put_contents('222.jpg',$img);
 //exit;
 //$reimg="/20140529/1401333398.jpg";
 //dump($reimg);
 //exit;
 if($reimg[1]<=0){
 exit("下载图片失败");
 }
 $reimg=$reimg[0];
 import('ORG.Util.Image');
 $Image = new Image();
 $imgurl = getcwd().$reimg;
 $ext=strrchr($imgurl,".");
 $thum_name = $Image->thumb($imgurl,"thum_".time().$ext,'','288','432');
 rename(getcwd()."/".$thum_name,getcwd().$mulu.$thum_name);//移动到文件夹里面
 $imginfo = $Image->getImageInfo(getcwd().$mulu.$thum_name);
 //dump($imginfo);
 $imgarr['cover_url']=$reimg;
 $imgarr['thum_url']=$mulu.$thum_name;
 $imgarr['thum_w']=$imginfo['width'];
 $imgarr['thum_h']=$imginfo['height'];
 return $imgarr;
 }

php中页面301跳转我们使用header()函数发送状态代码301的同时再跳转到指定页面了,实现的方法非常的简单。

注意:

301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于:
301 redirect: 301 代表永久性转移(Permanently Moved),
302 redirect: 302 代表暂时性转移(Temporarily Moved ),

例子

在php中正常的临时跳转通常使用:
 

 代码如下 复制代码
<?php
 header("Location:your_dest_url");
?>

最简单的做法

 代码如下 复制代码

$the_host = $_SERVER['HTTP_HOST'];//取得当前域名
if($the_host != 'noniu.com')//判断获取的这个域名是不是你想要的(即定向后的域名)
{
header("HTTP/1.1 301 Moved Permanently");//发出301头部
header("Location:111cn.net) //跳转到你希望的域名
exit();
}

这个还可以实现比如111cn.net 跳转到www.111cn.net 上,也就是让所有的页面都用带www的网址

 代码如下 复制代码

<?php
$the_host = $_SERVER['HTTP_HOST'];//取得当前域名
$the_url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';//判断地址后面部分
$the_url = strtolower($the_url);//将英文字母转成小写
if($the_url=="/index.php")//判断是不是首页
{
$the_url="";//如果是首页,赋值为空
}
if($the_host !== 'www.111cn.net ')//如果域名不是带www的网址那么进行下面的301跳转
{
header('HTTP/1.1 301 Moved Permanently');//发出301头部
header('Location:http://www.111cn.net '.$the_url);//跳转到带www的网址
}
?>

7、Apache下301转向代码

新建.htaccess文件,输入下列内容(需要开启mod_rewrite):

1)将不带WWW的域名转向到带WWW的域名下

 代码如下 复制代码

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^lesishu.cn [NC]
RewriteRule ^(.*)$ http://www.111cn.net /$1 [L,R=301]

2)重定向到新域名

 代码如下 复制代码

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^(.*)$ http://www.111cn.net /$1 [L,R=301]

wordpres根目录301跳转

 代码如下 复制代码

# BEGIN WordPress
Options +FollowSymlinks
RewriteEngine on
RewriteCond %{http_host} ^111cn.net  [NC]
RewriteRule ^(.*)$ http://www.111cn.net /$1 [L,R=301]
rewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /index.php HTTP/
rewriteRule ^index.php$ http://www.111cn.net / [R=301,L]
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress

测试

 

php域名301转向程序代码

分析:

php 301跳转代码只适合于全php页面或单页面做跳转了,apache/iis 301跳转适用于大量的网站域名301跳转了,他们两共同点都是实现301但两者各人有优点吧,大家自行根据自己情况选择吧。

下面来简单的介绍在php中get_meta_tags()、CURL与user-agent信息对比情况,如果你对于这篇文章有兴趣可进入参考学习。

get_meta_tags()函数用于抓取网页中<meta name="A" content="1"><meta name="B" content="2">形式的标签,并装入一维数组,name为元素下标,content为元素值,上例中的标签可以获得数组:array('A'=>'1', 'b'=>'2')。其他<meta>标签不处理,并且此函数只处理到</head>标签时截止,之后的<meta>也不再继续处理,不过<head>之前的<meta>还是会处理。

user-agent是浏览器在向服务器请求网页时,提交的不可见的头信息的一部分。头信息是一个数组,包含多个信息,比如本地缓存目录,cookies等,其中user-agent是浏览器类型申明,比如IE、Chrome、FF等。

今天在抓取一个网页的<meta>标签的时候,总是得到空值,但是直接查看网页源代码又是正常的,于是怀疑是否服务器设置了根据头信息来判断输出。先尝试使用get_meta_tags()来抓取一个本地的文件,然后这个本地文件将获取的头信息写入文件,结果如下(其中替换成了/,方便查看):

 代码如下 复制代码

array (
  'HTTP_HOST' => '192.168.30.205',
  'PATH' => 'C:/Program Files/Common Files/NetSarang;C:/Program Files/NVIDIA Corporation/PhysX/Common;C:/Program Files/Common Files/Microsoft Shared/Windows Live;C:/Program Files/Intel/iCLS Client/;C:/Windows/system32;C:/Windows;C:/Windows/System32/Wbem;C:/Windows/System32/WindowsPowerShell/v1.0/;C:/Program Files/Intel/Intel(R) Management Engine Components/DAL;C:/Program Files/Intel/Intel(R) Management Engine Components/IPT;C:/Program Files/Intel/OpenCL SDK/2.0/bin/x86;C:/Program Files/Common Files/Thunder Network/KanKan/Codecs;C:/Program Files/QuickTime Alternative/QTSystem;C:/Program Files/Windows Live/Shared;C:/Program Files/QuickTime Alternative/QTSystem/; %JAVA_HOME%/bin;%JAVA_HOME%/jre/bin;',
  'SystemRoot' => 'C:/Windows',
  'COMSPEC' => 'C:/Windows/system32/cmd.exe',
  'PATHEXT' => '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC',
  'WINDIR' => 'C:/Windows',
  'SERVER_SIGNATURE' => '',
  'SERVER_SOFTWARE' => 'Apache/2.2.11 (Win32) PHP/5.2.8',
  'SERVER_NAME' => '192.168.30.205',
  'SERVER_ADDR' => '192.168.30.205',
  'SERVER_PORT' => '80',
  'REMOTE_ADDR' => '192.168.30.205',
  'DOCUMENT_ROOT' => 'E:/wamp/www',
  'SERVER_ADMIN' => 'admin@admin.com',
  'SCRIPT_FILENAME' => 'E:/wamp/www/user-agent.php',
  'REMOTE_PORT' => '59479',
  'GATEWAY_INTERFACE' => 'CGI/1.1',
  'SERVER_PROTOCOL' => 'HTTP/1.0',
  'REQUEST_METHOD' => 'GET',
  'QUERY_STRING' => '',
  'REQUEST_URI' => '/user-agent.php',
  'SCRIPT_NAME' => '/user-agent.php',
  'PHP_SELF' => '/user-agent.php',
  'REQUEST_TIME' => 1400747529,
)

果然在数组中没有HTTP_USER_AGENT这个元素,apache在向另外一台服务器发送请求的时候是没有UA的。之后查了一下资料,get_meta_tags()函数没有伪造UA的能力,所以只能使用其他办法解决了。

后来使用CURL来获取,就获取到了网页,不过使用上稍微麻烦一点,首先伪造UA,获取之后在使用正则表达式分析<meta>
伪造办法:

 代码如下 复制代码

// 初始化一个 cURL
$curl = curl_init();

// 设置你需要抓取的URL
curl_setopt($curl, CURLOPT_URL, 'http://localhost/user-agent.php');

// 设置是否将文件头输出到浏览器,0不输出
curl_setopt($curl, CURLOPT_HEADER, 0);

// 设置UA,这里是将浏览器的UA转发到服务器,也可以手动指定值
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);

// 设置cURL 参数,要求结果返回到字符串中还是输出到屏幕上。0输出屏幕并返回操作结果的BOOL值,1返回字符串
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

// 运行cURL,请求网页
$data = curl_exec($curl);

// 关闭URL请求
curl_close($curl);

// 处理获得的数据
var_dump($data);

json_encode()函数是一个在php中可以把数组转换成json格式的函数了,但json_encode函数对于英文是没有任何问题,如果碰到中文或编码有不致情况时会出现中文转换之后变空了,下面我就来从多方面来介绍php返回json数据应用与一些使用转换时的问题解决办法。

json_encode()函数用法。

echo json_encode(array('a'=>'bbbb','c'=>'ddddd');

这样就会生成一个标准的json格式的数据

 代码如下 复制代码

<?php

//需要执行的SQL语句
//单条
$sql="select id,name from tbl_user where id=1";
//多条数据
//$sql="select id,name from tbl_user";

//调用conn.php文件进行数据库操作
require('Conn.php');

//提示操作成功信息,注意:$result存在于conn.php文件中,被调用出来
if($result)
{

// $array=mysql_fetch_array($result,MYSQL_ASSOC);
 
  
 /*数据集

 $users=array();
 $i=0;
 while($row=mysql_fetch_array($result,MYSQL_ASSOC)){

   echo $row['id'].'-----------'.$row['name'].'</br>';
   $users[$i]=$row;
   $i++;

 }
  echo json_encode(array('dataList'=>$users));

 */

 /*单条数据*/

 $row=mysql_fetch_row($result,MYSQL_ASSOC);
 
 echo json_encode(array('jsonObj'=>$row));
}

mysql_free_result($result);
//释放结果
mysql_close();
//关闭连接

?>

上面是数据库生成json数据了

单条数据:{"jsonObj":{"id":"1","name":"lmw"}}

多条数据:{"dataList":[{"id":"1","name":"lmw"},{"id":"2","name":"xxj"},{"id":"3","name":"xxxj"}]}


现在很多情况下,我们需要程序返回一个Json格式的结果,比如:

 代码如下 复制代码

{
"UserKeyGetResponse":
{"RequestName":"e99e6d63e8c712d7699f52978a","api_key_value":"41954dd9b1cb6a95802eab6810"},
"error_response":
{"code":"NO_ERROR","msg":"获取系统参数成功"}
}

可以将结果写成这样的数组形式:
$respon = array('UserKeyGetResponse' => array('RequestName' => $api_request_name, 'api_key_value' => $api_key_value),
'error_response' => array('code' => 'NO_ERROR', 'msg' => '获取系统参数成功'));

代码

 代码如下 复制代码

function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
{
    static $recursive_counter = 0;
    if (++$recursive_counter > 1000) {
        die('possible deep recursion attack');
    }
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            arrayRecursive($array[$key], $function, $apply_to_keys_also);
        } else {
            $array[$key] = $function($value);
        }
        if ($apply_to_keys_also && is_string($key)) {
            $new_key = $function($key);
            if ($new_key != $key) {
                $array[$new_key] = $array[$key];
                unset($array[$key]);
            }
        }
    }
    $recursive_counter--;
}

g:
$error_respon = array('code' => 'ERROR_MSG_MISS', 'msg' => '消息不存在');
echo JSON($array);

结果为:
{"code":"ERROR_MSG_MISS","msg":"消息不存在"}
客户端就可以解析这个结果了,当然错误码要用数字代替。

这样就好多了我们显示的直接是中文了,当然显示那个16进制的编码也是没有问题的哦。

[!--infotagslink--]

相关文章

  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • c#中判断字符串是不是数字或字母的方法

    这篇文章介绍了C#判断字符串是否数字或字母的实例,有需要的朋友可以参考一下...2020-06-25
  • PostgreSQL判断字符串是否包含目标字符串的多种方法

    这篇文章主要介绍了PostgreSQL判断字符串是否包含目标字符串的多种方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-23
  • 详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • php字符串按照单词逐个进行反转的方法

    本文实例讲述了php字符串按照单词进行反转的方法。分享给大家供大家参考。具体分析如下:下面的php代码可以将字符串按照单词进行反转输出,实际上是现将字符串按照空格分隔到数组,然后对数组进行反转输出。...2015-03-15
  • C#使用Process类调用外部exe程序

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

    这篇文章主要介绍了微信小程序 页面传值详解的相关资料,需要的朋友可以参考下...2017-03-13
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • 使用list stream: 任意对象List拼接字符串

    这篇文章主要介绍了使用list stream:任意对象List拼接字符串操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-09
  • MySQL 字符串拆分操作(含分隔符的字符串截取)

    这篇文章主要介绍了MySQL 字符串拆分操作(含分隔符的字符串截取),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-22
  • C# 16 进制字符串转 int的方法

    这篇文章主要介绍了C# 16 进制字符串转 int的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 获取中文字符串的实际长度代码

    JS中默认中文字符长度和其它字符长度计算方法是一样的,但某些情况下我们需要获取中文字符串的实际长度,代码如下: 复制代码 代码如下: function strLength(str) { var realLength = 0, len = str.length, charCode = -1;...2014-06-07
  • uniapp微信小程序:key失效的解决方法

    这篇文章主要介绍了uniapp微信小程序:key失效的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-20
  • C#实现字符串转换成字节数组的简单实现方法

    这篇文章主要介绍了C#实现字符串转换成字节数组的简单实现方法,仅一行代码即可搞定,非常简单实用,需要的朋友可以参考下...2020-06-25
  • PostgreSQL 字符串处理与日期处理操作

    这篇文章主要介绍了PostgreSQL 字符串处理与日期处理操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-01
  • php 中英文混合字符串截取

    文章介绍一个实用的函数,我们如果用php substr来截取字符在中文上处理的很有问题,今天自己写了一个比较好的中文与英文字符截取的函数,有需要的朋友可以参考下。 ...2016-11-25
  • PHP常用的小程序代码段

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

    时常会写用c#一些程序,但如何将他们和photoshop一样的大型软件打成一个压缩包,以便于发布....2020-06-25