正则表达式问题
完整的程序如下:
============================================================
#region 远程文件上传.....
#region 替换URL地址
/// <summary>
/// 替换字符串中的远程文件为本地文件并保存远程文件
/// </summary>
/// <param name="sHTML">要上传的内容</param>
/// <param name="sPath">文件路径</param>
/// <returns>返回替换后的HTML内容</returns>
public string ReplaceRemoteUrl(string sHTML, string sPath)
{
//设置为在上传内容中搜索指定值的正则表达式
System.Text.RegularExpressions.MatchCollection mc = System.Text.RegularExpressions.Regex.Matches(sHTML, @"(http://(?!(" + Context.Request.ServerVariables["SERVER_NAME"] + @"/shineOA/resource/))(\S*\/)((\S)+[.]{1}(gif|jpg|png|bmp)))", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
string[] a_RemoteUrl = new string[mc.Count];
//转入无重复数据
for (int i = 0; i < mc.Count; i++)
{
a_RemoteUrl[i] = (mc[i].Groups[0].ToString());
}
//保存的上传后的文件名称
string SaveFileName;
//文件类型
string SaveFileType;
//如果不存在建立目录
DirectoryInfo uploadForlder = new DirectoryInfo(Context.Server.MapPath(sPath));
if (!uploadForlder.Exists) uploadForlder.Create();
//遍历上传内容中允许的文件
foreach (string str in a_RemoteUrl)
{
//获取上传文件的扩展名
SaveFileType = str.Substring(str.LastIndexOf(".") + 1).ToLower();
//获取上传后的随机文件名
SaveFileName = System.String.Concat(DateTime.Now.Hour.ToString("00"), DateTime.Now.Minute.ToString("00"), DateTime.Now.Second.ToString("00"), new Random().Next(1, 99).ToString(), ".", SaveFileType);
//保存远程的文件到本地
if (SaveRemoteFile(sPath, SaveFileName, str))
{
sHTML = sHTML.Replace(str, sPath + SaveFileName);
}
}
return sHTML;
}
#endregion
#region 保存远程文件.....
/// <summary>
/// 保存远程的文件到本地
/// </summary>
/// <param name="s_LocalFolder"></param>
/// <param name="s_LocalFileName">保存到本地文件名</param>
/// <param name="s_RemoteFileUrl">远程读取的文件URL</param>
/// <returns>如果保存成功则返回 true,否则返回 false</returns>
private bool SaveRemoteFile(string s_LocalFolder, string s_LocalFileName, string s_RemoteFileUrl)
{
WebClient wc = new WebClient();
//下载远程文件资源
byte[] buff = wc.DownloadData(s_RemoteFileUrl);
if (buff.Length == 0)
{
return false;
}
string relativelyFilePathName = string.Concat(s_LocalFolder, s_LocalFileName);
//把远程文件保存到本地
using (System.IO.FileStream fs = new System.IO.FileStream(Context.Server.MapPath(relativelyFilePathName), System.IO.FileMode.Create, System.IO.FileAccess.Write))
{
fs.Write(buff, 0, buff.Length);
fs.Close();
}
return true;
}
#endregion
#endregion
====================================================================
其中第13行
System.Text.RegularExpressions.MatchCollection mc = System.Text.RegularExpressions.Regex.Matches(sHTML, @"(http://(?!(" + Context.Request.ServerVariables["SERVER_NAME"] + @"/shineOA/resource/))(\S*\/)((\S)+[.]{1}(gif|jpg|png|bmp)))", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
意思是匹配html字串中的所有的图片地址,但这种写法本身不包括匹配本地的“file:///”文件,只匹配http://文件
如果要匹配file:///地址的图片文件应该怎么改进呢?
感谢高手!