首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 网络编程-> JSP教程
用正则表达式得到网页上的链接-.NET教程,评论及其它
作者:网友供稿 点击:649
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
geturl.aspx代码如下:

<%@ page language="vb" codebehind="geturl.aspx.vb" autoeventwireup="false" inherits="aspxweb.geturl" %>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=gb2312">
</head>
<body>
<form id="form1" method="post" runat="server">
<p>
<asp:label id="label1" runat="server"></asp:label>
<asp:textbox id="urltextbox" runat="server" width="336px">
http://lucky_elove.www1.dotnetplayground.com/
</asp:textbox>
<asp:button onclick="scrapebutton_click" id="scrapebutton" runat="server"></asp:button>
</p>
<hr width="100%" size="1">
<p>
<asp:label id="tipresult" runat="server"></asp:label>
<asp:textbox id="resultlabel" runat="server" textmode="multiline"
width="100%" height="400"></asp:textbox>
</p>
</form>
</body>
</html>
后代码geturl.aspx.vb如下:

imports system.io
imports system.net
imports system.text
imports system.text.regularexpressions
imports system

public class geturl
inherits system.web.ui.page
protected withevents label1 as system.web.ui.webcontrols.label
protected withevents urltextbox as system.web.ui.webcontrols.textbox
protected withevents scrapebutton as system.web.ui.webcontrols.button
protected withevents tipresult as system.web.ui.webcontrols.label
protected withevents resultlabel as system.web.ui.webcontrols.textbox

#region " web 窗体设计器生成的代码 "

该调用是 web 窗体设计器所必需的。
<system.diagnostics.debuggerstepthrough()> private sub initializecomponent()

end sub

private sub page_init(byval sender as system.object, byval e as system.eventargs) handles mybase.init
codegen: 此方法调用是 web 窗体设计器所必需的
不要使用代码编辑器修改它。
initializecomponent()
end sub

#end region

private sub page_load(byval sender as system.object, byval e as system.eventargs) handles mybase.load
在此处放置初始化页的用户代码
label1.text = "请输入一个url地址:"
scrapebutton.text = "分离href链接"
end sub
private report as new stringbuilder()
private webpage as string
private countofmatches as int32

public sub scrapebutton_click(byval sender as system.object, byval e as system.eventargs)
webpage = graburl()
dim mydelegate as new matchevaluator(addressof matchhandler)

dim linksexpression as new regex( _
"\<a.+?href=[""](?!http\:\/\/)(?!mailto\:)(?>foundanchor>[^"">]+?)[^>]*?\>", _
regexoptions.multiline or regexoptions.ignorecase or regexoptions.ignorepatternwhitespace)

dim newwebpage as string = linksexpression.replace(webpage, mydelegate)

tipresult.text = "<h2>从 " & urltextbox.text & "分离出的href链接</h2>" & _
"<b>找到并整理" & countofmatches.tostring() & " 个链接</b><br><br>" & _
report.tostring().replace(environment.newline, "<br>")
tipresult.text &= "<h2>整理过的页面</h2><script>window.document.title=抓取网页中的链接</script>"
resultlabel.text = newwebpage
end sub

public function matchhandler(byval m as match) as string
dim link as string = m.groups("foundanchor").value
dim rtol as new regex("^", regexoptions.multiline or regexoptions.righttoleft)
dim col, row as int32
dim linebegin as int32 = rtol.match(webpage, m.index).index

row = rtol.matches(webpage, m.index).count
col = m.index - linebegin

report.appendformat( _
"link <b>{0}</b>, fixed at row: {1}, col: {2}{3}", _
server.htmlencode(m.groups(0).value), _
row, _
col, _
environment.newline _
)
dim newlink as string
if link.startswith("/") then
newlink = link.substring(1)
else
newlink = link
end if

countofmatches += 1
return m.groups(0).value.replace(link, newlink)
end function

private function graburl() as string
dim wc as new webclient()
dim s as stream = wc.openread(urltextbox.text)
dim sr as streamreader = new streamreader(s, system.text.encoding.default)
graburl = sr.readtoend
s.close()
wc.dispose()
end function

end class





这段正则表达式了用来验证email的:^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3}$
  在这段正则表达式中,“+”表示前面的字符串连续出现一个或多个;“^”表示下一个字符串必须出现在开头,“$”表示前一个字符串必须出现在结尾;“.”也就是“.”,这里“”是转义符;“{2,3}”表示前面的字符串可以连续出现2-3次。“()”表示包含的内容必须同时出现在目标对象中。“[_.0-9a-z-]”表示包含在“_”、“.”、“-”、从a到z范围内的字母、从0到9范围内的数字中的任意字符;
  这样一来,这个正则表达式可以这样翻译:
  “下面的字符必须在开头(^)”、“该字符必须包含在“_”、“.”、“-”、从a到z范围内的字母、从0到9范围内的数字中([_.0-9a-z-])”、“前面这个字符至少出现一次(+)”、@、“该字符串由一个包含在从a到z范围内的一个字母、从0到9范围内的数字中的字符开头,后面跟至少一个包含在“-”、从a到z范围内任何一个字母、从0到9范围内任何一个数字中的字符,最后以.结束(([0-9a-z][0-9a-z-]+.))”、“前面这个字符至少出现一次(+)”、“从a到z范围内的字母出现2-3次,并以它结束([a-z]{2,3}$)”

表示匹配但不获取,如果不用,会多获取几个匹配,占用资源。
?<1>引用名称,即表示该获取可以用$1引用,
如果想更好的使用正则,可以看以下连接,希望对你有用
http://expert.csdn.net/expert/topicview1.asp?id=1410423

单看一眼,和href\s*=\s*("[^"]"|\s+)区别
只是这个如果有引号会同时匹配到,同时也有$1
上面只是获取""内的内容,复杂了点但有实用

http://search.csdn.net/expert/topic/1450/1450366.xml?temp=.8075525







http://search.csdn.net/expert/topic/1895/1895427.xml?temp=.2321894
例如:
当前网页为:http://www.cccc.com/aa/bb/cc/dd/ee.htm,网页为有如下代码:

(1)href="../../../df/gov.htm"
需要转为:href="http://www.cccc.com/aa/df/gov.htm"

(2)href="../../special_index.htm"
需要转为:href="http://www.cccc.com/aa/bb/spcial_index.htm"

(3)href="/index.htm" class=white>频道主页</a>
需要转为:href="http://www.cccc.com/index.htm" class=white>频道主页</a>

(4)<img src=/myexe/wind_chromeless_2.1.js>
需要转为:<img src=http://www.cccc.com/myexe/wind_chromeless_2.1.js>

(5)background-image: url(images/index/samea.jpg)[css代码中]
需要转为:background-image: url(http://www.cccc.com/aa/bb/cc/dd/images/index/samea.jpg)

(6)url="mailto:sztakung@public.szptt.net.cn"又不能转换。

现在比较头痛的问题是:网页并不都是很规范的。有的属性值用了引号(或单引号或双引号),还有的没有用引号,更有甚者,单双引号嵌套。但又必须保证不乱,否则就会乱掉。




1.首先确定出 http://www.cccc.com/aa/bb/cc/dd/ee.htm 的根 http://www.cccc.com

2.确定出 http://www.cccc.com/aa/bb/cc/dd/ee.htm 得目录 http://www.cccc.com/aa/bb/cc/dd

2.在所有像 href="/、src="/ 这样的前面加入 http://www.cccc.com

3.在所有 href="???.htm、src="???.jpg 前面加入 http://www.cccc.com/aa/bb/cc/dd/

4.像 href="../../../df/gov.htm" 计算出有多少个 ../ ,有3个,表示从 http://www.cccc.com/aa/bb/cc/dd 后退3层,先将 http://www.cccc.com/aa/bb/cc/dd 反向排列,找到第3个 / 的位置,从这个位置开始提取字符,将提取的字符再次反向,得到http://www.cccc.com/aa/,提取 href="../../../df/gov.htm" 中的第3个 / 后面所有字符和前面得到的 http://www.cccc.com/aa/ 组合。

5.像 ../ 和 ../../ 用 4 的办法同样计算。

6.像 url(???/??.jpg) 只要在 url( 后面插入 http://www.cccc.com/aa/bb/cc/dd 就行了。

用正则表达式
string pattern = @"(href\s*=\s*)|(src\s*=\s*)[""](?<url>[^""]+)[""]";
regex r = new regex(pattern, regexoptions.compile | regexoptions.ignorecase);
for(match m = r.match(yourhtmlpagestring); m.sucess; m = m.nextmatch())
{
string url = m.result("${url}");
// 处理该url
}





已经解决。
<%@ page language="vb" debug="true"%>
<%@ import namespace="system.net" %>
<%@ import namespace="system.io" %>
<script language="vb" runat="server">
sub page_load(sender as object,e as eventargs)
if ispostback=false then
dim strurl as string
strurl=request.querystring("url")
if strurl="" then
strurl=trim(request.params("url"))
end if
strurl=strurl.trimend("/")
response.write(strurl & "<br>")
if strurl<>nothing and strurl.startswith("http://") then
dim wc as new system.net.webclient()
dim html as string = encoding.default.getstring(wc.downloaddata(strurl))
response.write(html)
dim strregex as string

strregex="\b(href|src|url|background)=((""|)?\s*([^\>\s]*?)\2?(\s)|([^>]*?>))"
html=regexlinks(strregex,html,strurl)

strregex="\b(href|src|background)=(""|)?\s*([^\>\s]*?)\2?(\s)"
html=regexlinks(strregex,html,strurl)
strregex="\b(href|src|background)\s*=\s*(""|)?\s*([^>\s]*?)\2?\/?>"
html=regexlinks(strregex,html,strurl)
response.write(html)

end if
end if
end sub

function regexlinks(byval strregex as string,byval html as string,byval strurl as string)
dim arrlink() as string
dim firstquot,lastquot as string
dim stroldfulllink,stroldlink,strnewfulllink,strnewlink as string
dim strlink as string
dim strspace as string
dim objregex as regex
dim objmatch as match
dim objmatchcollection as matchcollection
objregex=new regex(strregex,regexoptions.ignorecase or regexoptions.multiline)
objmatchcollection=objregex.matches(html)
for each objmatch in objmatchcollection
strlink=objmatch.value
erase arrlink
arrlink=strlink.split("=")
如果链接中有http://www.domain.com/news.asp?date=200306&keyword=news&page=2等类似情况时,ubound>=2,此时后面无空格,否则错误
if ubound(arrlink)<2 then
strspace=" "
else
strspace=""
end if
if arrlink(1).startswith("""") then
stroldfulllink=arrlink(1)
if arrlink(1).lastindexof("""")>1 then
if arrlink(1).endswith(">") then
arrlink(1)=arrlink(1).trimend(">")
lastquot=""">"
else
lastquot=""""
end if
end if
stroldlink=arrlink(1).replace("""","")
firstquot=""""
strnewlink=dolinks(strurl,stroldlink)
strnewfulllink=firstquot & trim(strnewlink) & trim(lastquot)
response.write("替换前:双引号" & stroldfulllink & "<br>")
response.write("替换后:双引号<font color=red>" & strnewfulllink & "</font><br>")
elseif arrlink(1).startswith("") then
stroldfulllink=arrlink(1)
if arrlink(1).lastindexof("")>1 then
if arrlink(1).endswith(">") then
arrlink(1)=arrlink(1).trimend(">")
lastquot=">"
else
lastquot=""
end if
end if
stroldlink=arrlink(1).replace("","")
firstquot=""
strnewlink=dolinks(strurl,stroldlink)
strnewfulllink=firstquot & trim(strnewlink) & trim(lastquot)
response.write("替换前:单" & stroldfulllink & "<br>")
response.write("替换后:单<font color=red>" & strnewfulllink & "</font><br>")
else
stroldfulllink=arrlink(0) & "=" & arrlink(1)
stroldfulllink=arrlink(1)
stroldlink=arrlink(1)
strnewlink=dolinks(strurl,stroldlink)
strnewfulllink=arrlink(0) & "=" & trim(strnewlink)
strnewfulllink=trim(strnewlink)
response.write("前:无" & stroldfulllink & "<br>")
response.write("后:无<font color=red>" & strnewfulllink & "</font><br>")
end if
html=html.replace(stroldfulllink,trim(strnewfulllink) & strspace)

firstquot=nothing
lastquot=nothing
stroldfulllink=nothing
strnewfulllink=nothing
next
regexlinks=html
end function

function dolinks(byval strurl as string,byval strtemplink as string)
dim objregexsite as regex
objregexsite=new regex("http://[^/]+",regexoptions.ignorecase)
dim strsite as string
strsite=trim(objregexsite.match(strurl).value.tostring)
dim strlinkf as string
dim strurlf as string
strurlf=strurl.replace(strsite,"")
dim arrdir() as string
dim idirlen as integer
if strurlf.indexof("/")>=0 then
arrdir=strurlf.split("/")
idirlen=arrdir.length
strurlf=strurlf.replace(arrdir(idirlen-1),"")
end if

dim k,j as integer
dim objmatchcolf as matchcollection
dim objregexf as regex
if strtemplink.tolower.startswith("javascript:") or strtemplink.tolower.startswith("mailto:") or strtemplink.tolower.startswith("#") or _
strtemplink.tolower.startswith("http://") or strtemplink.tolower.startswith("www.") then
strlinkf=strtemplink
elseif strtemplink.startswith("../") then
objregexf=new regex("\.\.\/")
objmatchcolf=objregexf.matches(strtemplink)
j=objmatchcolf.count
当下载网页链接的"../"个数+1大于该网页链接层数时,说明网页本身有误,则指向最底层链接。
if isarray(arrdir) then
if ubound(arrdir)<j+1 then
j=ubound(arrdir)-1
end if
for k=j-1 to 0 step -1
strurlf=trim(strurlf.remove(strurlf.lastindexof(arrdir(idirlen-2-k)),len(arrdir(idirlen-2-k))+1))
next
end if
dim strend as string
strend=trim(strtemplink.replace("../",""))
strlinkf=strsite.substring(0,len(strsite)) & strurlf & strend
elseif strtemplink.startswith("./") then
http://www.southcn.com/news/china
./todaycn/200306260529.htm
strlinkf=strurl & strtemplink.replace("./","/")
elseif strtemplink.startswith("/") then
strlinkf=strsite & strtemplink
else
if strurlf="" then
strurlf="/"
end if
strlinkf=strsite & strurlf & strtemplink
end if
dolinks=strlinkf
end function

</script>
<html>
<body>
</body>






go to
http://www.regexlib.com/search.aspx

enter "links" in the keyword textbox and click on search button

or try

using system.text.regularexpressions;

string str = "............";

regex re = new regex(@"<a[^>]+href=\s*(?:(?<href>[^]+)|""(?<href>[^""]+)""|(?<href>[^>\s]+))\s*[^>]*>", regexoptions.ignorecase | regexoptions.singleline);

matchcollection mc = re.matches(str);
console.writeline(mc.count);
foreach (match m in mc)
console.writeline(m.groups["href"].value);
}



文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·利用 Java Web Start发布你用java程序-JSP教程,Java技巧及代码
·用正则表达式得到网页上的链接-.NET教程,评论及其它
·MSMQ,Enterprise Service, DotNet Remoting,Web Service 的优缺点-.NET教程,Web Service开发
·用vb编一个计算器,需要用到数组,看看下面的代码,欢迎来找碴!-.NET教程,VB.Net语言
·jsp页面中的下载功能实现-JSP教程,Jsp/Servlet
·利用Java 创建和读取Excel文档-JSP教程,Java技巧及代码
·JSP语法(8)——<jsp:forward>-JSP教程,Jsp/Servlet
·Hibernate 配置!-JSP教程,资料/其它
·java、J2EE基础问题汇总-JSP教程,Java技巧及代码
·Java手机程序设计入门 电子书开放下载(转自CSDN)-JSP教程,J2ME开发
最新文章
·photoshop制作重彩风格非主流照片效果_photoshop教程
·google补充材料没消失,内链优化很重要_seo网站优化
·个人网站建设到底怎样赚钱_网赚技巧
·英文垃圾站全功略ip日100月赚50刀_网赚技巧
·清客讲网赚思路_网赚技巧
·windear与渡虎谷密谋_站长访谈
·口碑网ceo李治国专访:独特的平衡之道_站长访谈
·密密麻麻圈网邵晨:我从“互动”中赚钱_站长访谈
·蔡文胜:站长的乐趣是享受建站的过程_站长访谈
·“鹰”之路—访著名linux内核程序员大鹰_站长访谈
相关主题
  • 用正则表达式来校验数据的合法性-ASP教程,正则表达式
  • 用正则表达式过滤脚本的一些研究(asp.net + C#)-.NET教程,C#语言
  • 用正则表达式解析C#文件(updated)-.NET教程,C#语言
  • 用正则表达式剔除文本中的HTML标记-ASP教程,正则表达式
  • 用正则表达式解析C#文件(updated)-.NET教程,C#语言
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭