代碼為:
復(fù)制代碼 代碼如下:
//程序目的,去掉圖片路徑中的域名
var str = 'img src="https://www.jb51.net/images/logo.gif">';
var reg1 = /(\img)(.*(?=(http|https)\:\/\/))((http|https)\:\/\/[^\/]*)/gim;
str.match(reg1);
alert(str.replace(RegExp.$4,'');
這個用法在字符串中只有一個URL時,是適用的,但是如果字符串中包含多個域名,例如:
復(fù)制代碼 代碼如下:
var str = 'img src="https://www.jb51.net/images/logo.gif">腳本之家首頁的a ;
程序運行后去掉的內(nèi)容就是第二個域名即https://www.jb51.net。這是為什么呢?
仔細查看正則表達式會發(fā)現(xiàn),在使用"(\img) "匹配了img之后,使用“.*”匹配所有字符直到“http://”或者“https://”。請注意,正是“.*”導(dǎo)致了這個問題的出現(xiàn),這里的“.*”就是說,一直查找和匹配,盡可能的多匹配,直到最后一個限定符,也就是說術(shù)語中的貪婪(greedy)匹配。很自然,就想到了使用非貪婪的匹配解決這個問題。把正在表達式改為:
復(fù)制代碼 代碼如下:
//與貪婪匹配的差別就是多了一個問號“?”,貪婪".*",非貪婪".*?"
var reg1 = /(\img)(.*?(?=(http|https)\:\/\/))((http|https)\:\/\/[^\/]*)/gim;
解決問題的方法很簡單,但是也說明平時工作存在的一個重要問題:程序測試不充分。