提取链接正则

hfsross 2008-10-25 09:55:36

function get_url($str){
//$pat='/<a(.*?)href=\'(.*?)\'(.*?)>(.*?)<\/a>/i';
$pat="'<\s*a\s.*?href\s*=\s*([\"\'])?(?(1)(.*?)\\1|([^\s\>]+))[^>]*>?(.*?)</a>'isx";
///:/http:\/\/[a-zA-Z0-9][a-zA-Z0-9\/._-]+[\.html]/;
preg_match_all($pat,$str,$matches);
return $matches;
}
$stream="sdkkk<center><a href=dffd/aa.php?diih=23>sdfsdfffdd</a></center><a href='http://www.dfkdf.com/sdfkjsdf.asp?id=334'>dfkds</a><a href=\"dffd/aa.php?diih=3\">3222</a><a href='dffd/aa.html'>3222</a><a href='#'>3222</a><a href='javascript:void(0)'>3222</a>";
//echo($stream);
$matches=get_url($stream);
print_r($matches);

这个正则提取出来会把#和javascript都提取出来。
我想把这两种都排除
请问这个正则要怎么改呢?
...全文
164 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hdw116 2008-10-27
  • 打赏
  • 举报
回复
关注中...
hfsross 2008-10-27
  • 打赏
  • 举报
回复
能不能改这个呢
我发现这个比我原来的好多了
只要排除target=_black就可以了
$pat="/<\s*a\s.*?href\s*=\s*[\"\']*([^\s\>#\'\"\)\(]+)[\"\']*[^\>\<]*>(.*?)\<\/a\>/is";
hejunbin 2008-10-27
  • 打赏
  • 举报
回复

echo '<pre>';
function get_url($str){
//$pat='/<a(.*?)href=\'(.*?)\'(.*?)>(.*?)<\/a>/i';
$pat="'<\s*a\s.*?href\s*=\s*([\"\'])?(?(1)(?!\#|javascript)(.*?)\\1|([^\s\>]+))[^>]*>?(.*?)</a>'isx";
///:/http:\/\/[a-zA-Z0-9][a-zA-Z0-9\/._-]+[\.html]/;
preg_match_all($pat,$str,$matches);
return $matches;
}
$stream="sdkkk<center><a href=dffd/aa.php?diih=23>sdfsdfffdd</a></center><a href='http://www.dfkdf.com/sdfkjsdf.asp?id=334'>dfkds</a><a href=\"dffd/aa.php?diih=3\">3222</a><a href='dffd/aa.html'>3222</a><a href='#'>3222</a><a href='javascript:void(0)'>3222</a>";
//echo($stream);
$matches=get_url($stream);
print_r($matches);
echo '</pre>';
hfsross 2008-10-27
  • 打赏
  • 举报
回复
当target=_blank的时候也不行啊。
正则很难看懂,看了几个晚上,都没怎么了解
hfsross 2008-10-25
  • 打赏
  • 举报
回复
楼上的也有挺多问题的

Array
(
[0] => Array
(
[0] => <A href="http://www.aa.com">aa</A>
[1] => <A href="http://www.aa.com">aa</A>
[2] => <A
href="http://www.google.com/coop/cse?cx=017961863061223484325:by0hzdu5kl0"
target=_blank>搜索</A>
<LI><A href="#" target=_blank>论坛社区</A>


像这样的就认不出来了


[26] => <A href="move1-92.html" target="_blank"><IMG alt="刘心武揭秘红楼梦_秦可卿被告发之谜" src="http://www.11173.cn/Uploadpic/ALLIMG/200752521481638366.jpg" width="100" height="100"></A> <!--100*100 -->
<H3><A href="move1-92.html" target="_blank">刘心武揭秘红楼梦_秦可卿被告发之谜</A></H3>
<P><SPAN class=movie_date>发布时间:2008-09-14</SPAN><BR><SPAN
class=movie_category>分类:<A
href="list1-4-1.html">幽默搞笑</A>

[27] =>


这个也认不出来
程序猿之殇 2008-10-25
  • 打赏
  • 举报
回复

$pat="/<\s*a\s.*?href\s*=\s*[\"\']*([^\s\>#\'\"\)\(]+)[\"\']*>(.*?)\<\/a\>/is";

你的正则过于滥用.*?了,我给你精简一下.
hfsross 2008-10-25
  • 打赏
  • 举报
回复
楼上是啊,
如果<a href='#'>asdfasd </a>这样的串也给提取出来,我要排除这一种
还有<a href='javascript:viod(0)'>asdfasd </a>像这种javascript的也排除呀
程序猿之殇 2008-10-25
  • 打赏
  • 举报
回复
$matches[2]这个数组里就是你提取的链接.
$matches[0]提取的是符合<a href='xxx'>asdfasd</a>这样的串,
这是preg_match_all这个函数的特点.
程序猿之殇 2008-10-25
  • 打赏
  • 举报
回复

$pat="/<\s*a\s.*?href\s*=\s*[\"\']*([^\s\>#\'\"\)\(]+)[\"\']*[^\>\<]*>(.*?)\<\/a\>/is";

万变不离其踪,只要知道原理就很容易做了.
你这个不是要匹配一下,可能加target="_blank"的这种情况吗,加上[^\>\<]*就好了,同理,如果在href加上有,也可以加个[^\>\<]*这样的,
我只能说的是,不要烂用非贪婪写法(.*?),
一是会影响效率,
二是避免出现匹配不正常的情况.

21,882

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧