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

PHP
《PHP设计模式介绍》第十三章 适配器模式
《PHP设计模式介绍》第十四章 动态记录模式
《PHP设计模式介绍》第十五章 表数据网关模式
《PHP设计模式介绍》第十六章 数据映射模式
《PHP设计模式介绍》第十七章 MVC 模式
Zend Framework 入门——快速上手
Zend Framework 入门——多国语言支持
Zend Framework 入门——错误处理
Zend Framework 入门——页面布局
详细介绍php5编程中的异常处理
PHP5 OOP编程中的代理与异常
PHP程序的常见漏洞攻击分析
PHP.MVC的模板标签系统
PHP教程:PHP编码书写规范
PHP开发大型项目的方法:OOP思想
php使用curl模拟用户登陆
php对gb编码动态转utf-8编码的几种方法评测
php设计模式介绍之章代理模式
“在phpMyAdmin使用用户口令登陆”补充
PHP入门速成

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 114 ::
收藏到网摘: 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