2015-12-26 22 views
1

我希望一些幫助寫在PHP中的正則表達式清潔某些類型的資產的域從潛在含有多個資產(圖像,JavaScript等的網址字符串轉換)域變化正則表達式的文件類型CDN集成

例如:

$string = 'Some content including image tags <img src="http://domain.com/image.png" /> and image urls http://domain.com/image.png and javascript links <script src="http://domain.com/funtimes.js"></script> and js urls http://domain.com/funtimes.js but not this image http://notthisdomain.com/nope.png'; 

正則表達式應該http://domain.com更改資產域http://cdndomain.com,但僅適用於使用擴展名的文件:巴紐.jpg,.gif和.js文件的.css

所需的輸出爲上面會

$string = 'Some content including image tags <img src="http://cdndomain.com/image.png" /> and image urls http://cdndomain.com/image.png and javascript links <script src="http://cdndomain.com/funtimes.js"></script> and js urls http://cdndomain.com/funtimes.js but not this image http://notthisdomain.com/nope.png'; 

回答

1

更換

(?:http:\/\/domain.com)(\S*?\.(?:png|jpg|gif|js|css))\b 

http://cdndomain.com\1 

See it in action


的想法是你自己的域名,其次是多個字符,然後是一個擴展。更換與新域和字符串的其餘部分在組捕獲1
三個重要的事情,這裏要注意:

  • \S*(多個非空格字符)用於該URL的其餘部分匹配。不使用.*["']*或類似的東西,如果你得到一個失敗的比賽,後來有與延伸線之間的將被包含在比賽的另一個文件是很重要的。
  • 這是與?懶,以便我們也不會在比賽之間進入。
  • 有末字邊界(\b),因此,僅僅有字符它js一個詞(例如)不會結束比賽,這是實際的擴展。
1
$string = 'Some content including image tags <img src="http://domain.com/image.png" /> and image urls http://domain.com/image.png and javascript links <script src="http://domain.com/funtimes.js"></script> and js urls http://domain.com/funtimes.js but not this image http://notthisdomain.com/nope.png'; 
$file_types = "png|js|jpeg|jpg"; 

echo preg_replace ("/http:\/\/domain.com([^\"']*($file_types))[\"']/" , "http://cdn.domain.com$1" , $string); 

# output: 
# Some content including image tags <img src="http://cdn.domain.com/image.png" /> and image urls http://cdn.domain.com/image.png and javascript links <script src="http://cdn.domain.com/funtimes.js"></script> and js urls http://cdn.domain.com/funtimes.js but not this image http://notthisdomain.com/nope.png 

它的工作方式是它開始通過匹配http://domain.com。然後,它保持搜索,直到找到您所定義的$file_types擴展之一,其多以雙引號或單引號([\"'])緊隨其後。

如果在搜索擴展期間的任何時候,它首先遇到單引號或雙引號([^\"']),我們可以推斷出我們目前正在查看的這個網址沒有我們正在尋找的擴展名,所以我們在下一個網址重新開始搜索。

+0

謝謝!並感謝您的解釋! – user1678033