php 匹配字符中链接地址程序代码

 更新时间:2016年11月25日 17:29  点击:1615
昨天有一个朋友问题可不可以检查用户提交的数据中是否包括了超级连接,如果有的话就直接过滤了,下面我来给大家介绍过滤连接的办法。

判断一个字符串是否含有超级链接

 代码如下 复制代码

$str="ssdsf<a target='_blank' href='http://www.111cn.net/' >sdf</a>sdfss";
if(preg_match("/<a/s+href=[^>]*>|<//[^a]*a[^>]*>/i",$str))
{
echo "该字符串有超链接";
}
else
{
echo "该字符串没有超链接标记";
}
?>


下面我们只要过滤连接部份。

 代码如下 复制代码

<?php
echo preg_replace("/(?<=href=)([^>]*)(?=>)/i","#", "<a href='www.111cn.net'>你好,点这里看看</a><a href='www.111cn.net'>你好,点这里看看</a>");
?>

正则:/(?<=href=)([^>]*)(?=>)/

(?<=exp) 匹配exp后面的位置
(?=exp) 匹配exp前面的位置
此正则 匹配 在 href= 之后 “>” 之前 的 非 “>” 的所有字符

例子:<a href='www.111cn.net '>

找到这些字符(url)用 # 替换,就可以去掉html里的所有链接。

现在分享一个提取超级连接的实例

 

 代码如下 复制代码

function match_links($document) {   

    preg_match_all("'<s*as.*?hrefs*=s*(["'])?(?(1)(.*?)\1|([^s>]+))[^>]*>?(.*?)</a>'isx",$document,$links);                       

    while(list($key,$val) = each($links[2])) {

        if(!empty($val))

            $match['link'][] = $val;

    }

    while(list($key,$val) = each($links[3])) {

        if(!empty($val))

            $match['link'][] = $val;

    }       

    while(list($key,$val) = each($links[4])) {

        if(!empty($val))

            $match['content'][] = $val;

    }

    while(list($key,$val) = each($links[0])) {

        if(!empty($val))

            $match['all'][] = $val;

    }               

    return $match;

}

在php中数据查询可以分类一维数组查找,与多维数组查找了,如果是简单的一维数组我们可以直接使用in_array ,array_search 与遍历来实例了,如果是多维数组就需要使用其它办法。

对于一维数组我们可以如下操作

in_array  '函数在数组中搜索给定的值。in_array(value,array,type)type 可选。如果设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同。

array_key_exists 'array_key_exists() 函数判断某个数组中是否存在指定的 key,如果该 key 存在,则返回 true,否则返回 false。array_key_exists(key,array)

array_search 'array_search() 函数与 in_array() 一样,在数组中查找一个键值。如果找到了该值,匹配元素的键名会被返回。如果没找到,则返回 false。array_search(value,array,strict)

从这里来看,在数据量不大的时候,比如小于1000,查找用哪一种都行,都不会成为瓶颈;
当数据量比较大的时候,用array_key_exists比较合适。
当然这里array_key_exists占用的内存比较大,经测算

二分法查找数组是否包含某一元素,兼容正反序,代码实现:

 代码如下 复制代码

<?php

$searchValue = (int)$_GET['key'];

function search(array $array, $value)
{
$max = count($array)-1;
$min = 0;
$isAscSort = $array[$min] < $array[$max];

while (TRUE) {
$sum = $min+$max;
$midKey = (int)($sum%2 == 1 ? ceil($sum/2) : $sum/2);

if ($max < $min) {
return -1;
} else if ($value == $array[$midKey]) {
return 1;
} else if ($value > $array[$midKey]) {
$isAscSort ? $min = $midKey+1 : $max = $midKey-1;
} else if ($value < $array[$midKey]) {
$isAscSort ? $max = $midKey-1 : $min = $midKey+1;
}
}
}

$array = array(
'4', '5', '7', '8', '9', '10', '11', '12'
);
// 正序
echo search($array, $searchValue);

// 逆序
rsort($array);
echo search($array, $searchValue);

例二

PHP 查找数组第i小元素

 代码如下 复制代码

<?php
     #随机选择第i小的数字,用随机快排实现
    
     #交换元素
     function swap(&$arr, $i, $j) {
         $temp = $arr[$i];
         $arr[$i] = $arr[$j];
         $arr[$j] = $temp;
     }
 
     #随机划分
     function randomized_partition(&$arr, $begin, $end) {
         $rand_inx = rand($begin, $end);
         swap($arr, $begin, $rand_inx);
         return partition($arr, $begin, $end);
     }
 
     #划分
     function partition(&$arr, $begin, $end) {
         #以第一个元素作为中枢元素
         $pivot = $begin;
         $low = $begin;
         $high = $end;
 
         while ($low < $high) {
             while ($low < $high && $arr[$low] <= $arr[$pivot]) {
                 $low++;
             }
 
             while ($low < $high && $arr[$high] >= $arr[$pivot]) {
                 $high--;
             }
 
             swap($arr, $low, $high);
         }
 
         #交换中枢元素
         if ($arr[$pivot] < $arr[$low]) {
             $low--;
         }
         swap($arr, $pivot, $low);
         return $low;
     }
 
     #快速排序,此处没用到
     function quick_sort(&$arr, $begin, $end) {
         $q = randomized_partition($arr, $begin, $end);
         if ($q > $begin) {
             quick_sort($arr, $begin, $q - 1);
         }
         if ($q < $end) {
             quick_sort($arr, $q + 1, $end);
         }
     }
 
     #选取第i小的数
     function randomized_select(&$arr, $begin, $end, $i) {
         if ($begin == $end) {
             return $arr[$begin];
         }
 
         $q = randomized_partition($arr, $begin, $end);
         $k = $q - $begin + 1; #k代表小于等于q的元素个数
 
         if ($k == $i) { #如果k=i,说明q就是第i小的元素坐标
             return $arr[$q];
         } else if ($i < $k) { #如果i<k,说明第i小的元素位于q的左边
             return randomized_select($arr, $begin, $q - 1, $i);
         } else { #第i小的元素位于q的右边,此时查找右边的第i-k小的元素
             return randomized_select($arr, $q + 1, $end, $i - $k);
         }
     }
 
     $arr = array(1, 5, 3, 7, 0, 0, 8, 4, 2, 9, 11);
     $t = randomized_select($arr, 0, count($arr) - 1, 8);
     print_r("The 8th minimum element: {$t}");
     echo "<br>";
     quick_sort($arr, 0, count($arr) - 1);
     print_r($arr);
 ?>

下面我来给大家介绍在php正则匹配图片路径原理与实现方法,有需要了解的朋友可进入参考参考。

提取src=里面的图片地址还不足够,因为不能保证那个地址一定是绝对地址,完全的地址,如果那是相对的呢?如果地址诸如:
albums/Candids/thumb_P1050338.jpg
/content/media/touts/5271608/5271654/15320982
那该如何是好?
有时在这些地址前面需要加http://example1.com/ ,有些甚至要加http://example1.com/example2/.../ 于是,要写出出一种法则符合所有要求,简直是天方夜谭。只能见机行事对症下药。有时,需要从前面动刀,有时需要从后面砍断。
今天,我惊讶地知道了一个道理,原来http://example.com/ 和http://example.com////// 是一样的!
http://img3.douban.com/pics/nav/lg_main_a6.png

http://img3.douban.com////pics////nav///lg_main_a6.png
最终你都能到达

 

图片网址规范的html代码无非就是


1 <img src="??" title="??" alt="??" border="??" width="??" height="??" />
??和??是非必需的,若要通过XHTML认证??、??、??、??必不可少。

就正则谈正则的话,我写出的最短匹配是


1 (?<=img.+?src=").*?(?=")
不过,这条在php里不行,会出现:


1 Warning: preg_match_all() [function.preg-match-all]: Compilation failed: lookbehind assertion is not fixed length at offset *** in ***
 纠结了很久,都不行,原因何在呢?试了很多次,终于发现问题在(?<=img.+?src=")这个零宽断言里,在php中,零宽断言里不支持类似“*”、“+”这些无限次的东西,于是报错了,把“.+?”改为定长就好。不过,要“img”和“src=”之间定长基本上是不可能的。通常,图片地址的img和src只会相隔一个很简单的空格,但不排除某些情况在src之前,img后有alt、titlte等东西。

所以


1 (?<=img.src=").*?(?=")

 

1 (?<=imgssrc=").*?(?=")
 

可能可以,但不保证100%没问题。

你也许会问,单纯

 

1 (?<=src=").*?(?=")
不行吗?通常情况,可以,但,搜索过页面的盆友应该知道,除了图片地址用src开头以外,javascript地址也用src开头!而且,太多神通广大的不可预知因素隐含其中,于是这个貌似很简短完美的写法就行不通了。
你又或许会问,聪明简短的不行,我把图片的后缀列出来,总该可以了吧,如


1 (?<=src=").*?.(jpg|jpeg|gif|png|bmp|JPG|JPEG|GIF|PNG|BMP)
的确,这个写法实在是很老实,不过,你见过没有后缀的图片?wwe.com 有很多这种例子呢

RAW http://us.wwe.com/content/media/images/Headers/15559182
SmackDown http://us.wwe.com/content/media/images/Headers/15854138
NXT http://us.wwe.com/content/media/images/Headers/15929136
Superstars http://us.wwe.com/content/media/images/Headers/15815850

上面的网址都是图片,但都没有传统后缀,你老实也没用,还是不能获取到它们。

怎么办呢?还可以这样

 


1 <img(.*?)src="(.*?)(?=")
 和上面的表达式不同,这次的结果中array[0]的内容不是我们想要的,我们要的图片地址在array[2]里。为什么呢?因为我们用了2个 (.*?),每个“()”的东西会自动存在一个组里,而array[0]代表结果的汇总,array[1]包含了img和src里的所有东西,array[2]才轮到我们想要的图片地址。这种匹配方法,既能匹配有传统后缀的图片,也能匹配一些无后缀的图片文件,同时又不会杀错其它src=文件。个人感觉还是不错的,呵呵。当然了,如果你还有更好的建议,请马上留言,全球人民都会感谢你!
你到底要什么样的图片,是固定格式还是其它?得具体情况具体分析呢。
我的建议是:
如果你要的图片地址的格式是img空格src=的,请使用:(?<=img.src=").*?(?=") ,数组唯一,你懂的。
否则,请使用<img(.*?)src="(.*?)(?=") ,记得留意有用内容所在的数组位置哦!


并在项目中使用了很长时间的正则吧.


/<img.*srcs*=s*["|']?s*([^>"'s]*)/i


,我使用kindeditor保存文章,但是需要取出第N个图片的地址作为文章的标志图片,文章代码(内容的html)保存到数据库一个字段,然后图片地址保存到另外一个字段.我就是使用上面的正则解决的.

我说明下,上面的地址是直接获取img标签内src属性的值.在使用该正则的php页面访问该路径如果能找到图片的话,可以直接使用,如果不能,你可以使用preg_match_all将所有地址先保存到数组,然后处理路径,比如获取文件名称(不含路径部分),然后重新组成url,再删除图片.

我的例子:


preg_match_all("/<img.*srcs*=s*["|']?s*([^>"'s]*)/i",str_ireplace("\","",$content),$arr);


呵呵 我的内容部分被php给加上转义了,所以我需要先把去除,str_ireplace("\","",$content),然后将匹配的内容保存到$arr数组(二维的).
$arr[1]就是存储该路径的数组.

本文章给大家介绍在php正则表达式解析字符串里的所有URL地址实现代码,有需要了解学习的朋友可进入参考。

分享一个同事写的URL正则表达式,缺点不支持中文URL:

 代码如下 复制代码

(http[s]{0,1}|ftp)://[a-zA-Z0-9\.\-]+\.([a-zA-Z]{2,4})(:\d+)?(/[a-zA-Z0-9\.\-~!@#$%^&*+?:_/=<>]*)?

下面介绍一个可以支持中文正则url

 

 代码如下 复制代码
var regexp = new RegExp("(http[s]{0,1}|ftp)://[a-zA-Z0-9\.\-]+\.([a-zA-Z]{2,4})(:\d+)?(/[a-zA-Z0-9\.\-~!@#$%^&amp;*+?:_/=<>]*)?", "gi");
var urls = textbox.value.match(regexp) || [];//textbox为文本框
console.log(urls);


实例

 代码如下 复制代码

<?php
// $html        = the html on the page
// $current_url = the full url that the html came from (only needed for $repath)
// $repath      = converts ../ and / and // urls to full valid urls
function pageLinks($html, $current_url = "", $repath = false){
    preg_match_all("/<a.+?href=("|')(?!javascript:|#)(.+?)("|')/i", $html, $matches);
    $links = array();
    if(isset($matches[2])){
        $links = $matches[2];
    }
    if($repath && count($links) > 0 && strlen($current_url) > 0){
        $pathi      = pathinfo($current_url);
        $dir        = $pathi["dirname"];
        $base       = parse_url($current_url);
        $split_path = explode("/", $dir);
        $url        = "";
        foreach($links as $k => $link){
            if(preg_match("/^../", $link)){
                $total = substr_count($link, "../");
                for($i = 0; $i < $total; $i++){
                    array_pop($split_path);
                }
                $url = implode("/", $split_path) . "/" . str_replace("../", "", $link);
            }elseif(preg_match("/^///", $link)){
                $url = $base["scheme"] . ":" . $link;
            }elseif(preg_match("/^/|^.//", $link)){
                $url = $base["scheme"] . "://" . $base["host"] . $link;
            }elseif(preg_match("/^[a-zA-Z0-9]/", $link)){
                if(preg_match("/^http/", $link)){
                    $url = $link;
                }else{
                    $url       = $dir . "/" . $link;
                }
            }
            $links[$k] = $url;
        }
    }
    return $links;
}
header("content-type: text/plain");
$url = "http://www.111cn.net";
$html = file_get_contents($url);
// Gets links from the page:
print_r(pageLinks($html));

// Gets links from the page and formats them to a full valid url:
print_r(pageLinks($html, $url, true));

本文章来给大家介绍在PHP取网页所有链接实现程序代码,有直接利用正则的也有用在采集中过滤所有连接地址,有需要了解的朋友可参考。

我们核心代码就是正则表达试了

 代码如下 复制代码

function get_all_url($code){
             preg_match_all(‘/<as+href=["|']?([^>"' ]+)["|']?s*[^>]*>([^>]+)</a>/i’,$code,$arr);
            return array(‘name’=>$arr[2],’url’=>$arr[1]);
}

上面只是简单的下面看全例

 代码如下 复制代码

$url ='http://www.111cn.net';
$body=@file_get_contents($url);
preg_match_all('/href=['"]?([^'"]*)['"]?>(.*)/i',$body,$b);
$nums = array();
foreach($b[1] as $u){
  if(in_array($u,$nums)){
  continue;
  }
  $nums[]=$u;
  $title=strip_tags($u);
  echo $title."</br>";
}

利用curl函数来获取

 代码如下 复制代码

<?php
/*
 * 使用curl 采集www.111cn.net下的所有链接。 
 */
include_once('function.php');

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.111cn.net/');
// 只需返回HTTP header
curl_setopt($ch, CURLOPT_HEADER, 1);
// 页面内容我们并不需要
// curl_setopt($ch, CURLOPT_NOBODY, 1);
// 返回结果,而不是输出它
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$html = curl_exec($ch);
$info = curl_getinfo($ch);
if ($html === false) {
 echo "cURL Error: " . curl_error($ch);
}

curl_close($ch);
$linkarr = _striplinks($html);
// 主机部分,补全用
$host = 'http://www.111cn.net/';
if (is_array($linkarr)) {
 foreach ($linkarr as $k => $v) {
  $linkresult[$k] = _expandlinks($v, $host);
 }
}

printf("<p>此页面的所有链接为:</p><pre>%s</pre>n", var_export($linkresult , true));

?>

获取所有网址,但只有不重复的数据

 代码如下 复制代码

<?
  $e=clinchgeturl("http://im286.com/forumdisplay.php?fid=1");
  
  var_dump($e);
  function clinchgeturl($url)
  {
  
  //$url="http://127.0.0.1/1.htm";
  //$rootpath="http://fsrootpathfsfsf/yyyyyy/";
  //var_dump($rrr);
  if(eregi('(.)*[.](.)*',$url)){
   $roopath=split("/",$url);
   $rootpath="http://".$roopath[2]."/";
   $nnn=count($roopath)-1;for($yu=3;$yu<$nnn;$yu ){$rootpath.=$roopath[$yu]."/";}
   // var_dump($rootpath); //http: ,'',127.0.0.1,xnml,index.php
   }
   else{$rootpath=$url;//var_dump($rootpath);
  }
  if(isset($url)){
  echo "$url 有下列裢接:<br>";
  $fcontents = file($url);
  while(list(,$line)=each($fcontents)){
  while(eregi('(href[[:space:]]*=[[:space:]]*"?[[:alnum:]:@/._-] [?]?[^"]*"?)',$line,$regs)){
  //$regs[1] = eregi_replace('(href[[:space:]]*=[[:space:]]*"?)([[:alnum:]:@/._-] )("?)',"\2",$regs[1]);
  $regs[1] = eregi_replace('(href[[:space:]]*=[[:space:]]*["]?)([[:alnum:]:@/._-] [?]?[^"]*)(.*)[^"/]*(["]?)',"\2",$regs[1]);
  
  if(!eregi('^http://',$regs[1])){
  
   if(eregi('^..',$regs[1])){
   // $roopath=eregi_replace('(http://)?([[:alnum:]:@/._-] )[[:alnum:] ](.*)[[:alnum:] ]',"http://\2",$url);
  
   $roopath=split("/",$rootpath);
   $rootpath="http://".$roopath[2]."/";
   //echo "这是根本d :"."n";
   $nnn=count($roopath)-1;for($yu=3;$yu<$nnn;$yu ){$rootpath.=$roopath[$yu]."/";}
   //var_dump($rootpath);
   if(eregi('^..[/[:alnum:]]',$regs[1])){
   //echo "这是../目录/ :"."n";
   //$regs[1]="../xx/xxxxxx.xx";
   // $rr=split("/",$regs[1]);
   //for($oooi=1;$oooi<count($rr);$oooi )
  $rrr=$regs[1];
   // {$rrr.="/".$rr[$oooi];
   $rrr = eregi_replace("^[.][.][/]",'',$rrr); /

[!--infotagslink--]

相关文章

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

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

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 不打开网页直接查看网站的源代码

      有一种方法,可以不打开网站而直接查看到这个网站的源代码..   这样可以有效地防止误入恶意网站...   在浏览器地址栏输入:   view-source:http://...2016-09-20
  • php 调用goolge地图代码

    <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
  • JS基于Mootools实现的个性菜单效果代码

    本文实例讲述了JS基于Mootools实现的个性菜单效果代码。分享给大家供大家参考,具体如下:这里演示基于Mootools做的带动画的垂直型菜单,是一个初学者写的,用来学习Mootools的使用有帮助,下载时请注意要将外部引用的mootools...2015-10-23
  • C#使用Process类调用外部exe程序

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

    这篇文章主要介绍了微信小程序 页面传值详解的相关资料,需要的朋友可以参考下...2017-03-13
  • JS+CSS实现分类动态选择及移动功能效果代码

    本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
  • JS实现自定义简单网页软键盘效果代码

    本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
  • php 取除连续空格与换行代码

    php 取除连续空格与换行代码,这些我们都用到str_replace与正则函数 第一种: $content=str_replace("n","",$content); echo $content; 第二种: $content=preg_replac...2016-11-25
  • php简单用户登陆程序代码

    php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p>&nbsp;</p> <p>&nbsp;</p> <form name="form1...2016-11-25
  • PHP实现清除wordpress里恶意代码

    公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站PHP文件都存在恶意代码,就写了个简单的脚本清除。恶意代码示例...2015-10-23
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • JS实现双击屏幕滚动效果代码

    本文实例讲述了JS实现双击屏幕滚动效果代码。分享给大家供大家参考,具体如下:这里演示双击滚屏效果代码的实现方法,不知道有觉得有用处的没,现在网上还有很多还在用这个特效的呢,代码分享给大家吧。运行效果截图如下:在线演...2015-10-30
  • jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果

    本文实例讲述了jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果。分享给大家供大家参考,具体如下:这里演示jQuery实现鼠标移动到链接上,滑动展开/隐藏图片效果,鼠标放在“上一页”“下一页”上,立即浮现出所对应的图...2015-10-30
  • js识别uc浏览器的代码

    其实挺简单的就是if(navigator.userAgent.indexOf('UCBrowser') > -1) {alert("uc浏览器");}else{//不是uc浏览器执行的操作}如果想测试某个浏览器的特征可以通过如下方法获取JS获取浏览器信息 浏览器代码名称:navigator...2015-11-08
  • JS日期加减,日期运算代码

    一、日期减去天数等于第二个日期function cc(dd,dadd){//可以加上错误处理var a = new Date(dd)a = a.valueOf()a = a - dadd * 24 * 60 * 60 * 1000a = new Date(a)alert(a.getFullYear() + "年" + (a.getMonth() +...2015-11-08
  • uniapp微信小程序:key失效的解决方法

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

    微信支付,即便交了保证金,你还是处理测试阶段,不能正式发布。必须到你通过程序测试提交订单、发货通知等数据到微信的系统中,才能申请发布。然后,因为在微信中是通过JS方式调用API,必须在微信后台设置支付授权目录,而且要到...2014-05-31
  • PHP常用的小程序代码段

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