說明:因有個需求必須從某個網頁,跨網域到某一台Server取資料,但資料的內容含有html標籤,而我又想要能針對a、img標籤可以正常顯示,因此運用字串搜尋的方式,將我想修改的標簽進行修改,主要的作法是搜尋到a標籤修改href、img標籤修改src。
如您有更好的寫法,請建議,謝謝。
ASP.NET-VB.NET語法版本:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
Dim str_cont As String = String.Empty
'假設str_cont是取得後的資料
str_cont = "附件:<a href=""/boardfile/file/osa/%E6%B4%BB%E5%8B%95%E8%AA%AA%E6%98%8E1031231.pdf"" target=""_blank"">活動說明</a>、<a href=""/boardfile/file/cc/%E5%AF%A6%E6%96%BD%E8%BE%A6%E6%B3%951030930.docx"" target=""_blank"">實施辦法</a><br/><img alt=""活動海報"" src=""/boardfile/file/cc/poster1031003.jpg"" width=""640"" height=""902"" border=""0"" title=""活動海報"" /><br/>" & _
"一、為推廣並落實資訊教育,以及展示政府推動行政電子化之成效,臺北市電腦商業同業公會結合國內相關公會共同組成資訊月活動委員會,規劃辦理103年資訊月全國巡迴展示活動。"
str_cont = funbody(str_cont, "<a(.*?)>(.*?)<\/a\s*>", "href=") 'a標籤
str_cont = funbody(str_cont, "<img(.*?)>", "src=") 'img標籤
Response.Write(str_cont)
End If
End Sub
Function funbody(ByVal cont As String, ByVal Regex_where As String, ByVal edit_pro As String) As String
Dim x1 As Integer = 0, str_temp1 As String = String.Empty, str_temp2 As String = String.Empty, str_path As String = String.Empty,
strhtml_tag As String = String.Empty, strhtml_pro As String = String.Empty, si1 As Integer = 0, si2 As Integer = 0, si3 As Integer = 0 ', str_path As String = String.Empty
Dim regex As Regex = New Regex(Regex_where) '"<a\s+([\s\S]*?)>([\s\S]*?)<\/a\s*>"
Do
x1 = regex.Match(cont).Index
If x1 = 0 Then
str_temp2 = fun_string1(str_temp2, cont)
Exit Do '如果找不到標籤就跳出
Else
str_temp1 = cont.Substring(0, x1) '如果使用Mid擷取字串,起始位置要設定在1,如:Mid(cont, 1, x1)
str_temp2 = fun_string1(str_temp2, str_temp1)
cont = cont.Replace(str_temp1, "")
End If
If regex.Match(cont).Groups.Count > 0 Then
strhtml_tag = regex.Match(cont).Groups(0).Value '標籤
strhtml_pro = regex.Match(cont).Groups(1).Value '屬性
cont = cont.Replace(strhtml_tag, "")
si1 = strhtml_pro.IndexOf(edit_pro)
si2 = (strhtml_pro.IndexOf(Chr(34), si1)) + 1 '第一個雙引號
si3 = strhtml_pro.IndexOf(Chr(34), si2) '第二個雙引號
str_path = strhtml_pro.Substring(si2, (si3 - si2)) '取得屬性值
'因跨網域取資料的關西,所以搜尋對方的boardfile資料夾,來判斷對方是上傳到自己的server
If str_path.IndexOf("/boardfile/") <> -1 Then
strhtml_tag = strhtml_tag.Replace(str_path, "http://????" + str_path) 'http://???? 請修改為你自己要替換的網址
End If
str_temp2 = fun_string1(str_temp2, strhtml_tag)
End If
Loop
Return str_temp2
End Function
Function fun_string1(ByVal ori_string As String, ByVal addstring As String) As String
If ori_string = "" Then
ori_string = addstring
Else
ori_string = ori_string & addstring
End If
Return ori_string
End Function
P.S 如果要清除所有Html標籤,可以寫成 Dim regex As Regex = New Regex("<[^>]*>")
JavaScript版本:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="Pragma" content="No-cache" />
<title>Regular expression 抓 HTML 標籤屬性與內容</title>
<script type="text/javascript">
var r,str_cont;
//假設str_cont是取得後的資料
str_cont='附件:<a href="/boardfile/file/osa/%E6%B4%BB%E5%8B%95%E8%AA%AA%E6%98%8E1031231.pdf" target="_blank">活動說明</a>、<a href="/boardfile/file/cc/%E5%AF%A6%E6%96%BD%E8%BE%A6%E6%B3%951030930.docx" target="_blank">實施辦法</a><br/><img alt="活動海報" src="/boardfile/file/cc/poster1031003.jpg" width="640" height="902" border="0" title="活動海報" /><br/>一、為推廣並落實資訊教育,以及展示政府推動行政電子化之成效,臺北市電腦商業同業公會結合國內相關公會共同組成資訊月活動委員會,規劃辦理103年資訊月全國巡迴展示活動。';
r = /<a(.*?)>(.*?)<\/a\s*>/;
str_cont = funbody(str_cont,r,'href='); //a標籤
r = /<img(.*?)>/;
str_cont = funbody(str_cont,r,'src='); //img標籤
document.write(str_cont);
function funbody(cont,Regex_where,edit_pro){
var x1=0, str_temp1='', str_temp2='', str_path='', strhtml_tag='', strhtml_pro='', si1=0, si2=0, si3=0, arr;
while (true) {
x1=cont.search(Regex_where);
if(x1 == -1){
str_temp2 = fun_string1(str_temp2, cont);
break; //如果找不到a標籤就跳出
}else if (x1!=0){
str_temp1=cont.substring(0, x1); //第一次取出html標籤前的字串
str_temp2 = fun_string1(str_temp2, str_temp1);
cont=cont.replace(str_temp1,'');
};
arr = Regex_where.exec(cont);
if (arr != null){
strhtml_tag=arr[0];
strhtml_pro=arr[1];//屬性
cont=cont.replace(strhtml_tag,'');
si1=strhtml_pro.indexOf(edit_pro);
si2=(strhtml_pro.indexOf('"',si1))+1; //第一個雙引號
si3=strhtml_pro.indexOf('"',si2); //第二個雙引號
str_path=strhtml_pro.substring(si2, si3);
//因跨網域取資料的關西,所以搜尋對方的boardfile資料夾,來判斷對方是上傳到自己的server
if (str_path.indexOf('/boardfile/')!=-1){
//http://???? 請修改為你自己要替換的網址
strhtml_tag=strhtml_tag.replace(str_path,'http://????'+str_path);
};
str_temp2 = fun_string1(str_temp2, strhtml_tag);
};
};
return str_temp2;
};
function fun_string1(ori_string,addstring){
if (ori_string =='') {
ori_string = addstring;
}else{
ori_string = ori_string + addstring;
};
return ori_string;
};
</script>
</head>
<body >
</body>
</html>
沒有留言:
張貼留言