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

PHP
linux php mysql数据库备份实现代码
php mssql 日期出现中文字符的解决方法
PHP中查询SQL Server或Sybase时TEXT字段被截断的解决方法
php 动态添加记录
php 结果集的分页实现代码
php执行sql语句的写法
php连接mysql数据库代码
php 表单验证实现代码
php URL编码解码函数代码
php 表单数据的获取代码
php 异常处理实现代码
php 删除记录实现代码
php 获取mysql数据库信息代码
PHP 文件类型判断代码
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
php session 预定义数组
php session 检测和注销
php session处理的定制
php session应用实例 登录验证
php cookis创建实现代码

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


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