您的位置:首页 > 编程语言 > PHP开发

php用正则表达式过滤html的超链接及提取链接

2010-11-02 17:05 555 查看
echo preg_replace("/(?<=href=)([^/>]*)(?=/>)/i","#", "<a href='www.ccliving.cn">你好,点这里看看</a><a href='www.52syj.cn">你好,点这里看看</a>");


正则:/(?<=href=)([^/>]*)(?=/>)/
(?<=exp) 匹配exp后面的位置
(?=exp) 匹配exp前面的位置
此正则 匹配 在 href= 之后 “>” 之前 的 非 “>” 的所有字符
例子:<a href='www.jb51.net'>
找到这些字符(url)用 # 替换,就可以去掉html里的所有链接。
PHP完美的提取链接正则
function match_links($document) {
preg_match_all("'</s*a/s.*?href/s*=/s*([/"/'])?(?(1)(.*?)//1|([^/s/>]+))[^>]*>?(.*?)</a>'isx",$document,$links);
while(list($key,$val) = each($links[2])) {
if(!empty($val))
$match['link'][] = $val;
}
while(list($key,$val) = each($links[3])) {
if(!empty($val))
$match['link'][] = $val;
}
while(list($key,$val) = each($links[4])) {
if(!empty($val))
$match['content'][] = $val;
}
while(list($key,$val) = each($links[0])) {
if(!empty($val))
$match['all'][] = $val;
}
return $match;
}

PHP正则表达式提取超链接及其标题
有这么一段HTML,比较不规则的,如果要提取其中的链接地址和链接名称,怎么弄?
//HTML
$str = '<a id="top8" href="http://list.mp3.baidu.com/song/A.htm?top8 " mce_href="http://list.mp3.baidu.com/song/A.htm?top8 " class="p14" target="_top">歌曲列表</a><br><a target="_blank" id="bp" href="http://list.mp3.baidu.com/list/bangping.html " mce_href="http://list.mp3.baidu.com/list/bangping.html " class="p14">中文金曲榜</a><br><td nowrap="nowrap">• <a id="top19" href="qingyinyue.html?top19" mce_href="qingyinyue.html?top19" class="p14" target="_top">轻音乐</a></td>';


利用正则表达式是最简单的,其它的办法,偶米去想。。。
$pat = '/<a(.*?)href="(.*?)"(.*?)>(.*?)<//a>/i';
preg_match_all($pat, $str, $m);
输出方法:
print_r($m[2]);
print_r($m[4]);
或者:
for($i=0;$i<count($m[2]) ;$i++ ){
echo '<li><a href="'.$_SERVER['PHP_SELF'].'?url='.$m[2][$i].'">'.$m[4][$i].'</a>';
}
显示结果是:
Array ( [0] => http://list.mp3.baidu.com/song/A.htm?top8
[1] => http://list.mp3.baidu.com/list/bangping.html
[2] => qingyinyue.html?top19 ) Array ( [0] => 歌曲列表 [1] => 中文金曲榜 [2] => 轻音乐 )

//Fck编辑器提取超级链接时候去掉编译符号 / 的方法

class pp{

//判断FCK的上传附件,把编译的符号改过来
function match_links($document) {
preg_match_all("'</s*a/s.*?href/s*=/s*([/"/'])?(?(1)(.*?)//1|([^/s/>]+))[^>]*>?(.*?)</a>'isx",$document,$links);
while(list($key,$val) = each($links[2])) {
if(!empty($val))
$match['link'][] = $val;
}
while(list($key,$val) = each($links[3])) {
if(!empty($val))
$match['link'][] = $val;
}
while(list($key,$val) = each($links[4])) {
if(!empty($val))
$match['content'][] = $val;
}
while(list($key,$val) = each($links[0])) {
if(!empty($val))
$match['all'][] = $val;
}
return $match;
}
}

下面是执行:

$r=$k->match_links($fckvalue);

$wv="";

if($r!=""){

$pat = "'</s*a/s.*?href/s*=/s*([/"/'])?(?(1)(.*?)//1|([^/s/>]+))[^>]*>?(.*?)</a>'isx";

$fckvalue=preg_replace($pat,"<<<附件>>>",$fckvalue);

foreach($r["all"] as $kk => $vv){

$wv.=str_replace(array("//"),"",$vv
);

}

}

if($wv!=""){

$fckvalue=$fckvalue.$wv;

}

这样就完全可以使用FCK超级链接传到PHP页面的时候链接会变成:<a href=/"aaa.html/">aaa</a>这样的形式出现了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: