2017-03-22 52 views
1

首先,這與question有關我在一年前問過,現在我需要更改新代碼位https網站。如果丟失,請添加站點網址

基本上我需要添加網站的網址,如果它丟失,我在前面的問題中描述。

如:/blog/images/image.png需要改變http://www.example.com/blog/images/image.png

@anonymous已經給出了答案爲波紋管,

$html = preg_replace('@(http://www.example.com)?/[email protected]', 'http://www.example.com/blog', $html); 

但現在的問題是我https鏈接也,故當過我https鏈接它在上面的代碼中加入http://www.example.com/blog

例如:https://www.example.com/blog/images/image.png轉換爲https://www.example.com/http://www.example.com/blog/images/image.png

基本上現在我需要的/blog之前檢查都https://www.example.comhttp://www.example.com,如果其中非是可利用的只是在/blog前面加http://www.example.com。希望我對這個問題已經夠清楚了。

我該怎麼做?

關於我的正則表達式知識的道歉。

回答

2

添加一個可選s並在圖案中轉義點,然後使用preg_replace_callback檢查組1是否匹配。如果是的話,拿$1值,否則,硬編碼的更換:

$html = preg_replace_callback('@(https?://www\.example\.com)?/[email protected]', function($m) { 
    return empty($m[1]) ? 'http://www.example.com/blog' : $m[1] . "/blog"; 
}, $html); 

PHP demo

請注意,此處不需要U修飾符。在/blog之後,您可以添加(?=/|$)以確保blog僅在路徑的整個子部分(避免匹配/blogs/blogging/)時才匹配。

1

讓它替代任何/blog子未前面有協議的主機部分:

$html = preg_replace('@(?<!https://www\.example\.com)(?<!http://www\.example\.com)/[email protected]', 'http://www.example.com/blog', $html); 

正則表達式本身是:

(?<!https://www\.example\.com)(?<!http://www\.example\.com)/blog 

它檢查使用負先行http://www.example.comhttps://www.example.com前綴。請注意,我們必須使用兩個單獨的預覽,因爲前綴具有不同的長度。

演示:https://regex101.com/r/0ERgu7/1