当前位置: 首页 > 图文教程 > 网络编程 > PHP > PHP抓取网页的所有超链接的代码问题

PHP
PHP 执行系统外部命令 system() exec() passthru()
最新的php 文件上传模型,支持多文件上传
php 静态页面中显示动态内容
数据库查询记录php 多行多列显示
谈PHP生成静态页面分析 模板+缓存+写文件
PHP 各种排序算法实现代码
PHP nl2br函数 将换行字符转成 <br>
php 分页原理详解
Discuz 模板语句分析及知识技巧
php win下Socket方式发邮件类
怎样去阅读一份php源代码
建站常用13种PHP开源CMS比较
php xml留言板 xml存储数据的简单例子
PHP 开源AJAX框架14种
PHP 替换模板变量实现步骤
PHP has encountered an Access Violation at 7C94BD02解决方法
php 正则匹配函数体
php 文件夹删除、php清除缓存程序
php download.php实现代码 跳转到下载文件(response.redirect)
PHP类(Class)入门教程

PHP抓取网页的所有超链接的代码问题


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 145 ::
收藏到网摘: n/a

通用HTML标准超链接参数取得正则表达式测试

因为最近要做一个类似专业搜索引擎的东西,需要抓取网页的所有超链接。
大家帮忙测试一下子,下面的代码是否可以针对所有的标准超链接。

测试代码如下:
<?php 

// --------------------------------------------------------------------------
// File name   : Noname1.php
// Description : 通用链接参数获取正则表达式测试
// Requirement : PHP4 (http://www.php.net)
// Copyright(C), HonestQiao, 2005, All Rights Reserved.
// Author: HonestQiao ([email protected])
// 参数说明:
// $strSource: 包含标准链接的HTML网页
// $strResult: 处理的结果
// 附加说明:
// 标准链接,使用<a></a>形势包含的链接
// --------------------------------------------------------------------------
$strSource = <<<HTML
<a href=1.htm>t1</a>
<a href='2.htm'>t2</a>
<a href="3.htm">t3</a>
<a href=4.htm class=link>t4</a>
HTML;
preg_match_all('/<a.*?(?: |\\t|\\r|\\n)?href=[\'"]?(.+?)[\'"]?(?:(?: |\\t|\\r|\\n)+.*?)?>(.+?)<\/a.*?>/sim', $strSource, $strResult, PREG_PATTERN_ORDER);
for($i = 0; $i < count($strResult[1]); $i++)
{
    printf("%d href=(%s) title=(%s) \n", $i, $strResult[1][$i], $strResult[2][$i]);


?>


如果您的测试数据,符合标准链接,但是此处没有被处理出来,请告诉我测试数据,以及你的测试环境。

谢谢。

也欢迎提供任何怪异的超链接,不过使用javascript来打开链接的除外。

[ 本帖最后由 HonestQiao 于 2005-11-6 21:29 编辑 ]



 ydlhero 回复于:2005-11-06 17:44:26

版大 很多我看不懂 可否提供 正则表达方法的一些资料
我知道手册有点 但那点点远远不够^_^


 HonestQiao 回复于:2005-11-06 18:37:41

http://www.pcre.org/

如果要深究,可以查看这里。

太深奥而其表达也太过于简略,无法用通俗的语言去表达和解释。


 cloudchen 回复于:2005-11-06 20:27:41

匹配总是不能做到适应任何情况的,只要能适应一些常见的标记方法就OK了,否则不是一个正则能搞定的,浏览器在分析html标记时极其错误的写法也就忽略

这个有个问题asdfhref="1.htm"这也能获取到不太合适把,这样就不成获取属性了,得改改


 HonestQiao 回复于:2005-11-06 21:18:40

引用:原帖由 cloudchen 于 2005-11-6 20:27 发表
匹配总是不能做到适应任何情况的,只要能适应一些常见的标记方法就OK了,否则不是一个正则能搞定的,浏览器在分析html标记时极其错误的写法也就忽略

这个有个问题asdfhref="1.htm"这也能获取到不太合 ... 




等一下子我在修改,嘿嘿。

[ 本帖最后由 HonestQiao 于 2005-11-6 21:24 编辑 ]


 HonestQiao 回复于:2005-11-06 21:21:36

已经修正了,作为:

preg_match_all('/<a.*?(?: |\\t|\\r|\\n)?href=[\'"]?(.+?)[\'"]?(?:(?: |\\t|\\r|\\n)+.*?)?>(.+?)<\/a.*?>/sim', $strSource, $strResult, PREG_PATTERN_ORDER);


[ 本帖最后由 HonestQiao 于 2005-11-6 21:29 编辑 ]


 litie123 回复于:2005-11-06 21:57:02

<a href="so.php?id>gfgfd">这个有问题</a>


 笨狗 回复于:2005-11-07 08:23:00

如果不是一定要用php的话
偶推荐用perl的HTML::TokeParser
很好用D


 HonestQiao 回复于:2005-11-07 08:44:23

引用:原帖由 笨狗 于 2005-11-7 08:23 发表
如果不是一定要用php的话
偶推荐用perl的HTML::TokeParser
很好用D 



用perl很简单,作这个。

不果现在用php.


 HonestQiao 回复于:2005-11-07 08:45:31

引用:原帖由 litie123 于 2005-11-6 21:57 发表
<a href="so.php?id>gfgfd">这个有问题</a> 



啊,这也够BT的啊。


 langyufeng 回复于:2005-12-01 16:54:14

引用:原帖由 HonestQiao 于 2005-11-7 08:45 发表


啊,这也够BT的啊。 



先replace掉"就好拉


 Haohappy 回复于:2005-12-01 21:43:44

供参考呵呵。

preg_match_all("'<\s*a\s.*?href\s*=\s*     # find <a href=
                        ([\"\'])?                                 # find single or double quote
                        (?(1) (.*?)\\1 | ([^\s\>]+))   # if quote found, match up to next matching
                                                                    # quote, otherwise match up to next space
                        'isx", $document, $links);


 giant35 回复于:2006-07-08 19:14:04

<a.*?\s*href\s*=[\'"]?(.+?)[\'"].*?>(.+?)</a