C# 通過(guò)正則表達(dá)式實(shí)現(xiàn)保存時(shí)移除Html中src的域名及讀取時(shí)完善域名

原因

最近遇到一個(gè)以前一直忽略的問(wèn)題昵骤,在項(xiàng)目中如果一些富文本里需要上傳圖片地梨,這些圖片是保存在本地的,那存儲(chǔ)圖片路徑時(shí)就涉及到要保存完整路徑還是相對(duì)路徑煤率。

分析

  • 在前后端不分離的項(xiàng)目中皿渗,圖片和富文本編輯器所在的頁(yè)面是同域的斩芭,使用相對(duì)路徑也可以在富文本編輯器里展示圖片,故而數(shù)據(jù)庫(kù)中保存相對(duì)路徑即可乐疆。
  • 但是在前后端分離的項(xiàng)目中就不可以划乖,圖片無(wú)法加載,這時(shí)候需要使用完整路徑才能展示圖片挤土。
    這時(shí)候如果直接在數(shù)據(jù)庫(kù)中保存完整路徑的話琴庵,一旦需要更換域名,到時(shí)候再更新數(shù)據(jù)庫(kù)中保存的域名,那將是噩夢(mèng)细卧!

思路

要解決上述問(wèn)題尉桩,需要做一些操作,比如在保存富文本內(nèi)容時(shí)贪庙,把圖片地址的域名給移除,需要讀取富文本內(nèi)容時(shí)翰苫,再把圖片地址的域名加上止邮,予以完善。

代碼

  • 保存時(shí)移除Html中src的域名奏窑,支持英文域名和IP地址导披,支持?jǐn)y帶或不攜帶端口
/// <summary>
/// 移除HTML中SRC標(biāo)簽內(nèi)容里的域名 
/// 包含英文域名或IP地址,支持?jǐn)y帶或不攜帶端口
/// </summary>
/// <param name="html">HTML代碼</param>
/// <returns></returns>
public static string RemoveHtmlSrcDomainName(string html)
{
    if (string.IsNullOrEmpty(html))
    {
        return "";
    }

    /*
     * 正則解釋
     * 第一部分:(<\s*[^>]*?src\s*=\s*[""']?)埃唯,匹配src及之前的內(nèi)容
     * 第二部分:((?:http|https)?://[a-zA-z0-9]+(?:\.[a-zA-z0-9]+)*:{0,1}\d{0,5})撩匕,匹配以http協(xié)議或https協(xié)議開(kāi)頭的,英文域名或IP地址墨叛,可攜帶最長(zhǎng)5為數(shù)字的端口號(hào)
     * 第三部分:([^>]*?>)止毕,匹配src之后的內(nèi)容
     * 
     * 替換解釋?zhuān)?     * 正則表達(dá)式一共匹配出了三部分,用$1表示第一部分漠趁,$2表示第二部分扁凛,$3表示第三部分
     * 如果只是移除域名,則最終替換后的格式就是:"$1$3"
     * 如果需要把域名替換為其他字符串闯传,比如/resource/谨朝,則最終替換后的格式就是:"$1/resource/$3"
     * 
     * RegexOptions.IgnoreCase:忽略大小寫(xiě)
     */

    return Regex.Replace(html, @"(<\s*[^>]*?src\s*=\s*[""']?)((?:http|https)?://[a-zA-z0-9]+(?:\.[a-zA-z0-9]+)*:{0,1}\d{0,5})([^>]*?>)", "$1$3", RegexOptions.IgnoreCase);
}

這種方式可以最大限度的避免把不改移除的域名給移除掉,比如富文本里的文字中正好有要移除掉的域名甥绿,如果簡(jiǎn)單粗暴的使用Replace就會(huì)把所有符合條件的域名都移除字币,這里就可以避免。

  • 讀取時(shí)完善域名
/// <summary>
/// 補(bǔ)充完善HTML中SRC標(biāo)簽內(nèi)容里的域名
/// </summary>
/// <param name="html">HTML代碼</param>
/// <param name="domain">域名</param>
/// <returns></returns>
public static string ComplementHtmlSrcDomainName(string html, string domain)
{
    if (string.IsNullOrEmpty(html) || string.IsNullOrEmpty(domain))
    {
       return "";
    }
    return Regex.Replace(html, @"(<\s*[^>]*?)src=([""'])(?!((http|https)?://))([^""']+)", $"$1src=$2{domain}$5", RegexOptions.IgnoreCase);
}

小結(jié)

經(jīng)測(cè)試共缕,移除和完善都可正常使用洗出。但是這里只對(duì)具有src屬性的html標(biāo)簽起作用,如果需要在其他屬性中(比如href)也使用類(lèi)似的功能骄呼,可自行進(jìn)行優(yōu)化共苛。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蜓萄,隨后出現(xiàn)的幾起案子隅茎,更是在濱河造成了極大的恐慌,老刑警劉巖嫉沽,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辟犀,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡绸硕,警方通過(guò)查閱死者的電腦和手機(jī)堂竟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)魂毁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人出嘹,你說(shuō)我怎么就攤上這事席楚。” “怎么了税稼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵烦秩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我郎仆,道長(zhǎng)只祠,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任扰肌,我火速辦了婚禮抛寝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘曙旭。我一直安慰自己盗舰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布夷狰。 她就那樣靜靜地躺著岭皂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沼头。 梳的紋絲不亂的頭發(fā)上爷绘,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音进倍,去河邊找鬼土至。 笑死,一個(gè)胖子當(dāng)著我的面吹牛猾昆,可吹牛的內(nèi)容都是我干的陶因。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼垂蜗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼楷扬!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起贴见,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤烘苹,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后片部,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體镣衡,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了廊鸥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片望浩。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惰说,靈堂內(nèi)的尸體忽然破棺而出磨德,到底是詐尸還是另有隱情,我是刑警寧澤助被,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布剖张,位于F島的核電站,受9級(jí)特大地震影響揩环,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜幅虑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一丰滑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧倒庵,春花似錦褒墨、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至绍申,卻和暖如春噩咪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背极阅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工胃碾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人筋搏。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓仆百,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親奔脐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子俄周,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容