获取a链接标签。从Snoopy类中提取函数

这次阐明过了Snoopy类,他内里有较量完善的匹配源码,我看到有function fetchlinks($URI)。也就是获取<a>中链接的函数,可以很简朴的提取出来,另外我还发明,他的正则还支持高级语言中的三目运算,

<?php function _striplinks($document) { preg_match_all("'<\s*a\s.*?href\s*=\s*([\"\'])?(?(1) (.*?)\\1 | ([^\s\>]+))'isx", $document, $links); // catenate the non-empty matches from the conditional subpattern while (list($key, $val) = each($links[2])) { if (!empty($val)) $match[] = $val; } while (list($key, $val) = each($links[3])) { if (!empty($val)) $match[] = $val; } // return the links return $match; } $document = file_get_contents('http://www.qq.com'); $datalink = _striplinks($document); printf("<p>输出link数据为:</p><pre>%s</pre>\n", var_export($datalink , true)); ?>

我对源码去掉了注释。并上了个例子。很容易就获得了链接部门。

//支解线=====以下是对正则的表明阐明,只想要成果的可以忽略以下内容==============//

正则阐明:<\s*a\s.*?href\s*=\s*([\"\'])?(?(1) (.*?)\\1 | ([^\s\>]+))

'<\s*a\s.*?href\s*=\s*       # 查找 <a href=http://enenba.com/

([\"\'])?                    # 匹配单引或双引号为分组1,也可以没有

(?(1) (.*?)\\1 | ([^\s\>]+)) # 假如引号存在(分组1存在)匹配后引号

# 不然匹配非空格和非>内容

这个正则的难点也就是 (xxx)? (?(分组号) yyy|zzz)

我也是第一次遇到这样的正则,有点像高级语言的三目运算,我举个例子:

这个例子的目标是查找切合以下的法则

1、以123开头

2、后头有双引号则匹配引号和引号内的内容。

3、后头没有双引号,则是匹配后头为789的内容。

简朴来说是匹配123"……" 或 123789

有引号优先匹配

<?php $str = '123"456"789'; $search = '/123(")?(?(1).*?\\1|789)/'; preg_match($search,$str,$r); echo $r[0]; //output 123"456" echo '<br /><br />'; $str = '123456789'; $search = '/123(")?(?(1).*?\\1|789)/'; preg_match($search,$str,$r); echo $r[0]; //output NULL echo '<br /><br />'; $str = '123789456'; $search = '/123(")?(?(1).*?\\1|789)/'; preg_match($search,$str,$r); echo $r[0]; //output 123789 ?>

看到了吧,

名目就像三目运算,高级语言是这样的:

(xxx)? yyy : zzz     假如xxx为真 执行yyy,不然执行zzzz

在正则中是:

(xxx)? (?(分组号) yyy|zzz) 假如xxx不为空 执行yyy,不然执行zzzz

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/7924.html