PHP获取指定URL页面中的所有链接例子

 更新时间:2016年11月25日 17:41  点击:1795
这个东西其实我们开发人员来讲常用了,以前做一个抓取其它网站友情连接时用过,今天看到一朋友整理了一个PHP获取指定URL页面中的所有链接函数,整理过来我们一起来看看吧。


以下代码可以获取到指定URL页面中的所有链接,即所有a标签的href属性:

// 获取链接的HTML代码
$html = file_get_contents('http://www.111cn.net');

$dom = new DOMDocument();
@$dom->loadHTML($html);

$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate('/html/body//a');

for ($i = 0; $i < $hrefs->length; $i++) {
   $href = $hrefs->item($i);
   $url = $href->getAttribute('href');
   echo $url.'<br />';
}

这段代码会获取到所有a标签的href属性,但是href属性值不一定是链接,我们可以在做个过滤,只保留http开头的链接地址:


// 获取链接的HTML代码
$html = file_get_contents('http://www.111cn.net');

$dom = new DOMDocument();
@$dom->loadHTML($html);

$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate('/html/body//a');

for ($i = 0; $i < $hrefs->length; $i++) {
   $href = $hrefs->item($i);
   $url = $href->getAttribute('href');
  
   // 保留以http开头的链接
   if(substr($url, 0, 4) == 'http')
      echo $url.'<br />';
}

fopen()函数读取指定网页中的所有链接并统计出数量,在一些需要采集网页页容的地方,适合使用本代码,本例以读取百度首页为例,找出百度首页中所有的链接地址,代码经过测试,完全可用:

<?
if(empty($url))$url = "http://www.baidu.com/";//需要采集链接的URL地址
$site=substr($url,0,strpos($url,"/",8));
$base=substr($url,0,strrpos($url,"/")+1);//文件所在目录
$fp = fopen($url, "r" );//打开url地址页面
while(!feof($fp))$contents.=fread($fp,1024);
$pattern="|href=['\"]?([^ '\"]+)['\" ]|U";
preg_match_all($pattern,$contents, $regArr, PREG_SET_ORDER);//使用正则匹配所有href=
for($i=0;$i<count($regArr);$i++){//找出所有匹配的链接
if(!eregi("://",$regArr[$i][1]))//判断是否是相对路径,即是否还有://
    if(substr($regArr[$i][1],0,1)=="/")//是否是站点的根目录
    echo "link".($i+1).":".$site.$regArr[$i][1]."<br/>";//根目录
    else
    echo "link".($i+1).":".$base.$regArr[$i][1]."<br/>";//当前目录
else
    echo "link".($i+1).":".$regArr[$i][1]."<br/>";//相对路径
}
fclose($fp);
?>

正则表达式对于每一个程序员来讲都多少要知道一些了,下面来为各位整理了一些Python re(正则表达式)模块,希望文章能够帮助到各位。


一、Python中转义字符

  正则表达式使用反斜杠" \ "来代表特殊形式或用作转义字符,这里跟Python的语法冲突,因此,Python用" \\\\ "表示正则表达式中的" \ ",因为正则表达式中如果要匹配" \ ",需要用\来转义,变成" \\ ",而Python语法中又需要对字符串中每一个\进行转义,所以就变成了" \\\\ "。
上面的写法是不是觉得很麻烦,为了使正则表达式具有更好的可读性,Python特别设计了原始字符串(raw string),需要提醒你的是,在写文件路径的时候就不要使用raw string了,这里存在陷阱。raw string就是用'r'作为字符串的前缀,如 r"\n":表示两个字符"\"和"n",而不是换行符了。Python中写正则表达式时推荐使用这种形式。

二、正则表达式元字符说明:

.    匹配除换行符以外的任意字符
^    匹配字符串的开始
$    匹配字符串的结束
[]   用来匹配一个指定的字符类别
?   对于前一个字符字符重复0次到1次
*    对于前一个字符重复0次到无穷次
{}   对于前一个字符重复m次
{m,n} 对前一个字符重复为m到n次
\d   匹配数字,相当于[0-9]
\D   匹配任何非数字字符,相当于[^0-9]
\s   匹配任意的空白符,相当于[ fv]
\S   匹配任何非空白字符,相当于[^ fv]
\w   匹配任何字母数字字符,相当于[a-zA-Z0-9_]
\W   匹配任何非字母数字字符,相当于[^a-zA-Z0-9_]
\b   匹配单词的开始或结束

三、导入正则表达式模块

3.1、导入正则表达式模块
>>> import  re
3.2、查看正则表达式模块方法

>>> dir(re)

['DEBUG', 'DOTALL', 'I', 'IGNORECASE', 'L', 'LOCALE', 'M', 'MULTILINE', 'S', 'Scanner', 'T', 'TEMPLATE', 'U', 'UNICODE', 'VERBOSE', 'X', '_MAXCACHE', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__version__', '_alphanum', '_cache', '_cache_repl', '_compile', '_compile_repl', '_expand', '_pattern_type', '_pickle', '_subx', 'compile', 'copy_reg', 'error', 'escape', 'findall', 'finditer', 'match', 'purge', 'search', 'split', 'sre_compile', 'sre_parse', 'sub', 'subn', 'sys', 'template']

>>>


四、常用的正则表达式处理函数
4.1、re.search
     re.search 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回,如果字符串没有匹配,则返回None。
    提示:当我们不会用模块方法的时候用help
>>> help(re.search)
search(pattern, string, flags=0)

    第一个参数:规则
    第二个参数:表示要匹配的字符串
    第三个参数:标致位,用于控制正则表达式的匹配方式
    实例:下面的例子kuangl

>>> name="Hello,My name is kuangl,nice to meet you..."

>>> k=re.search(r'k(uan)gl',name)

>>> if k:

...     print k.group(0),k.group(1)

... else:

...     print "Sorry,not search!"

...

kuangl uan

4.2、re.match
    re.match 尝试从字符串的开始匹配一个模式,也等于说是匹配第一个单词
>>> help(re.match)
match(pattern, string, flags=0)
    第一个参数:规则
    第二个参数:表示要匹配的字符串
    第三个参数:标致位,用于控制正则表达式的匹配方式
    实例:下面的例子匹配Hello单词

>>> name="Hello,My name is kuangl,nice to meet you..."

>>> k=re.match(r"(\H....)",name)

>>> if k:

...      print k.group(0),'\n',k.group(1)

... else:

...     print "Sorry,not match!"

...

Hello

Hello

>>>


     re.match与re.search的区别:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字串,直到找到一个匹配。
4.3、re.findall
    re.findall 在目标字符串查找符合规则的字符串

>>> help(re.findall)

findall(pattern, string, flags=0)


   第一个参数:规则
   第二个参数:目标字符串
   但三个参数:后面还可以跟一个规则选择项
   返回的结果是一个列表,建中存放的是符合规则的字符串,如果没有符合规则的字符串呗找到,就会返回一个空值。
   实例:查找邮件账号

>>> mail='<user01@mail.com> <user02@mail.com> user04@mail.com' #第3个故意没有尖括号

>>> re.findall(r'(\w+@m....[a-z]{3})',mail)

['user01@mail.com', 'user02@mail.com', 'user04@mail.com']


4.4、re.sub
   re.sub 用于替换字符串的匹配项
>>> help(re.sub)
sub(pattern, repl, string, count=0)
   第一个参数:规则
   第二个参数:替换后的字符串
   第三个参数:字符串
   第四个参数:替换个数。默认为0,表示每个匹配项都替换
   实例:将空白处替换成-

>>> test="Hi, nice to meet you where are you from?"

>>> re.sub(r'\s','-',test)

'Hi,-nice-to-meet-you-where-are-you-from?'

>>> re.sub(r'\s','-',test,5)                      #替换至第5个

'Hi,-nice-to-meet-you-where are you from?'

>>>


4.5、re.split
   re.split 用于来分割字符串

>>> help(re.split)

split(pattern, string, maxsplit=0)


   第一个参数:规则
   第二个参数:字符串
   第三个参数:最大分割字符串,默认为0,表示每个匹配项都分割
   实例:分割所有的字符串

>>> test="Hi, nice to meet you where are you from?"

>>> re.split(r"\s+",test)

['Hi,', 'nice', 'to', 'meet', 'you', 'where', 'are', 'you', 'from?']

>>> re.split(r"\s+",test,3)                  #分割前三个

['Hi,', 'nice', 'to', 'meet you where are you from?']

>>>


4.6、re.compile
   re.compile 可以把正则表达式编译成一个正则对象
>>> help(re.compile)
compile(pattern, flags=0)
   第一个参数:规则
   第二个参数:标志位
   实例:

>>> test="Hi, nice to meet you where are you from?"

>>> k=re.compile(r'\w*o\w*') #匹配带o的字符串

>>> dir(k)

['__copy__', '__deepcopy__', 'findall', 'finditer', 'match', 'scanner', 'search', 'split', 'sub', 'subn']

>>> print k.findall(test)     #显示所有包涵o的字符串

['to', 'you', 'you', 'from']

>>> print k.sub(lambda m: '[' + m.group(0) + ']',test)  # 将字符串中含有o的单词用[]括起来

Hi, nice [to] meet [you] where are [you] [from]?


>>>
五、用urllib2、re、os 模块下载文件的脚本

#!/usr/bin/env python
import urllib2
import re
import os
URL='http://image.baidu.com/channel/wallpaper'
read=urllib2.urlopen(URL).read()
pat =  re.compile(r'src="http://.+?.js">')
urls=re.findall(pat,read)
for i in urls:
    url= i.replace('src="','').replace('">','')
try:
    iread=urllib2.urlopen(url).read()
    name=os.path.basename(url)
    with open(name,'wb') as jsname:
    jsname.write(iread)
except:


    print url,"url error"

正则表达试对数据的验证是非常的简单了我们直接可以使用preg_match进行验证了,下面我们来看看小编整理的两个数字验证的两个函数。

安全验证的时候就需要这个判断了下面有2个判断一个是判断需要输入的指定数量一个是几位数至几位数下面就是第一种的判断

php 数字长度是否为11位数组

<?php
$text = "111111111112";
if(preg_match('/^\d{11}$/', $text)){
echo "y";
}else{
echo "n";
}
?>

第二种为 判断是否为 4 位数到 11 位数

<?php
$text = "1111111";
if(preg_match('/^\d{6,11}$/', $text)){
echo "y";
}else{
echo "n";
}
?>

第三种,

echo $符合条件 = is_numeric($表单变量) && (($len = strlen($表单变量)) == 16 || $len == 18);

或者:

echo $符合条件 = preg_match("/^\d{16}|\d{18}$/", $表单变量);

字符替换对于学php程序开发的人员来讲估计都觉得不是事了,在此小编为各位整理一些关于替换变量中字符的一些例子,希望对各位有帮助。

preg_replace字符替换例子

这里介绍三种常用方法.

 代码如下 复制代码

方法一:

<?php
$str = preg_quote('(银子)');
$txt = '我的呢称(银子)';
echo preg_replace("/($str)/","<span style='color:#f00;'>$1</span>",$txt);
?>

方法二:

<?php
$str = quotemeta('(银子)');
$txt = '我的呢称(银子)';
echo preg_replace("/($str)/","<span style='color:#f00;'>$1</span>",$txt);
?>

方法三:

<?php
$str = '(银子)';
$txt = '我的呢称(银子)';
echo preg_replace("/(Q$strE)/","<span style='color:#f00;'>$1</span>",$txt);
?>

三种方法都返回同样结果.. PHP中的Perl风格正则与Perl完全一样.连quotemeta也是通用的..

str_replace() 函数使用一个字符串替换字符串中的另一些字符


function strreplace($str){
      $str = stripslashes($str);
      $str = str_replace(chr(92),'',$str);
      $str = str_replace(chr(47),'',$str);
      $str = str_replace(chr(10).chr(13),"<br>",$str);
      $str = str_replace('<',"&lt;",$str);

      $str = str_replace('>',"&gt;",$str);
      $str = str_replace(';',";",$str);
      $str = str_replace('"',"“",$str);
      $str = str_replace("'","‘",$str);
      $str = str_replace(" "," ",$str);
      $str = str_replace("/**/"," ",$str);

      return trim($str);
}

 双引号替换问题

$tmp_data= str_replace("\"","",$tmp_data);双引号替换为空字符串

$tmp_data= str_replace("\"","'",$tmp_data);双引号替换为单引号

当然ereg_replace 作为正则表达式必须关注的,也要提示一下

数字正则比字母来看是相对来说比较容易的了,下文小编给各位整理了几段数字正则表达式了,有兴起的可以进入 来看看。

例子,提取字符串中的数字

$str = ereg_replace('[^0-9]',",$str);和

$str = preg_replace( '/[^\d]/ ', ' ',$str);


数字正则过滤

if(preg_match("/^\d*$/",$yebihai))  
echo('是数字');
else 
echo('不是数字');

或者用函数

if(is_numeric($yebihai))
echo('是数字');
else
echo('不是数字');

下面验证数字一些正确

验证数字:^[0-9]*$
验证n位的数字:^\d{n}$
验证至少n位数字:^\d{n,}$
验证m-n位的数字:^\d{m,n}$
验证零和非零开头的数字:^(0|[1-9][0-9]*)$
验证有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
验证有1-3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
验证非零的正整数:^\+?[1-9][0-9]*$
验证非零的负整数:^\-[1-9][0-9]*$
验证非负整数(正整数 + 0)  ^\d+$
验证非正整数(负整数 + 0)  ^((-\d+)|(0+))$

[!--infotagslink--]

相关文章

  • PHP成员变量获取对比(类成员变量)

    下面本文章来给大家介绍在php中成员变量的一些对比了,文章举了四个例子在这例子中分别对不同成员变量进行测试与获取操作,下面一起来看看。 有如下4个代码示例,你认...2016-11-25
  • php 获取用户IP与IE信息程序

    php 获取用户IP与IE信息程序 function onlineip() { global $_SERVER; if(getenv('HTTP_CLIENT_IP')) { $onlineip = getenv('HTTP_CLIENT_IP');...2016-11-25
  • php获取一个文件夹的mtime的程序

    php获取一个文件夹的mtime的程序了,这个就是时间问题了,对于这个问题我们来看小编整理的几个例子,具体的操作例子如下所示。 php很容易获取到一个文件夹的mtime,可以...2016-11-25
  • Linux下PHP安装curl扩展支持https例子

    安装curl扩展支持https是非常的重要现在许多的网站都使用了https了,下面我们来看一篇关于PHP安装curl扩展支持https例子吧。 问题: 线上运行的lamp服务器,默认yu...2016-11-25
  • 如何获取网站icon有哪些可行的方法

    获取网站icon,常用最简单的方法就是通过website/favicon.ico来获取,不过由于很多网站都是在页面里面设置favicon,所以此方法很多情况都不可用。 更好的办法是通过google提供的服务来实现:http://www.google.com/s2/favi...2014-06-07
  • jquery如何获取元素的滚动条高度等实现代码

    主要功能:获取浏览器显示区域(可视区域)的高度 : $(window).height(); 获取浏览器显示区域(可视区域)的宽度 :$(window).width(); 获取页面的文档高度 $(document).height(); 获取页面的文档宽度 :$(document).width();...2015-10-21
  • jquery获取div距离窗口和父级dv的距离示例

    jquery中jquery.offset().top / left用于获取div距离窗口的距离,jquery.position().top / left 用于获取距离父级div的距离(必须是绝对定位的div)。 (1)先介绍jquery.offset().top / left css: 复制代码 代码如下: *{ mar...2013-10-13
  • jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果

    本文实例讲述了jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果。分享给大家供大家参考,具体如下:这里演示jQuery实现鼠标移动到链接上,滑动展开/隐藏图片效果,鼠标放在“上一页”“下一页”上,立即浮现出所对应的图...2015-10-30
  • Jquery 获取指定标签的对象及属性的设置与移除

    1、先讲讲JQuery的概念,JQuery首先是由一个 America 的叫什么 John Resig的人创建的,后来又很多的JS高手也加入了这个团队。其实 JQuery是一个JavaScript的类库,这个类库集合了很多功能方法,利用类库你可以用简单的一些代...2014-05-31
  • C#获取字符串后几位数的方法

    这篇文章主要介绍了C#获取字符串后几位数的方法,实例分析了C#操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • DOM XPATH获取img src值的query

    复制代码 代码如下:$nodes = @$xpath->query("//*[@id='main_pr']/img/@src");$prurl = $nodes->item(0)->nodeValue;...2013-10-04
  • jquery获取tagName再进行判断

    如果是为了取到tagName后再进行判断,那直接用下面的代码会更方便: $(element).is('input') 如果是要取到标签用作到别的地方,可以使用一下代码: $(element)[0].tagName 或: $(element).get(0).tagName...2014-05-31
  • PHP 如何获取二维数组中某个key的集合

    本文为代码分享,也是在工作中看到一些“大牛”的代码,做做分享。 具体是这样的,如下一个二维数组,是从库中读取出来的。 代码清单: 复制代码 代码如下: $user = array( 0 => array( 'id' => 1, 'name' => '张三', 'ema...2014-06-07
  • php获取汉字拼音首字母的方法

    现实中我们经常看到这样的说明,排名不分先后,按姓名首字母进行排序。这是中国人大多数使用的排序方法。那么在php程序中该如何操作呢?下面就分享一下在php程序中获取汉字拼音的首字母的方法,在网上搜到的大多数是有问题的...2015-10-23
  • 使用C#获取系统特殊文件夹路径的解决方法

    本篇文章是对使用C#获取系统特殊文件夹路径的解决方法进行了详细的分析介绍,需要的朋友参考下...2020-06-25
  • php使用floor去掉小数点的例子

    floor会产生小数了如果我们不希望有小数我们是可以去除小数点的了,下面一聚教程小编来为各位介绍php使用floor去掉小数点的例子,希望对各位有帮助。 float floor (...2016-11-25
  • php如何获取文件的扩展名

    网上也有很多类似的方法,不过都存在这样那样的不严谨的问题,本文就不一一分析了,这里只给出最正确的利用php 获取文件扩展名(文件后缀名)的方法。 function get_extension($filename){ return pathinfo($filename,PATHIN...2015-10-30
  • 基于JavaScript获取鼠标位置的各种方法

    这篇文章主要介绍了基于JavaScript获取鼠标位置的各种方法 ,需要的朋友可以参考下...2015-12-18
  • C#获取变更过的DataTable记录的实现方法

    这篇文章主要介绍了C#获取变更过的DataTable记录的实现方法,对初学者很有学习借鉴价值,需要的朋友可以参考下...2020-06-25
  • 如何获取百度搜索结果页中解密之后的真实链接

    大家用百度搜索的时候,可能会发现,结果链接用的还是百度的链接,点击之后才会跳转到另外一个页面,另外一个页面的真实链接如何获取到呢?? 通过分析发现: 可以看出,返回...2016-05-19