2010-03-14 125 views
0

我試圖使一個URL添加/所有hrefssrcs在一個字符串中。 它應該只添加一個/到其開頭沒有http://的網址,而且還沒有/URL替換正則表達式

如果我們有這樣的:

<a href="ABC">... 
<img src="DEFG">... 
<a href="/HIJ">... 
<a href="http://KLMN">... 

結果應該是這樣的:

<a href="/ABC">... 
<img src="/DEFG">... 
<a href="/HIJ">... 
<a href="http://KLMN">... 

這是我想出至今:

&(href|src)="?!(\/|http::\/\/)(.+)" 

而且替換將是

$1="/$2" 

雖然它不起作用。

  • 我在做什麼錯?
  • 將如何工作的正則表達式有看起來像
+0

URL如'foo/bar'怎麼樣?它不以'/'開始,但包含'/'。 – Gumbo 2010-03-14 16:02:49

+0

我在網址 – perf 2010-03-14 16:05:19

+0

的開頭http :: - > http: – chelmertz 2010-03-14 16:10:35

回答

0
$str = preg_replace('/(href|src)="([^\/][^:]*)"/', '\1="/\2"', $str) 

這將做你問什麼,但有一點例外,包含一個冒號(:)不會得到一個「/」添加任何字符串。這使得它可以輕鬆處理http://,ftp://等,但也不適用於「abcd:efgh」之類的內容。

0

這將匹配hrefsrc的標籤,第一組包含地址。

(<[^<]*?(?:href|src)=")(?!http|/)(.+?)("[^<]*?>) 

並將其替換:

$1/$2$3 
1

也許它足以與base element改變只是基礎URI:

<base href="/"> 

現在基本URI路徑是/代替的路徑當前文檔的URI。但請注意,這會影響所有相對URI,而不僅僅是那些具有相對URI路徑的相關URI。

+0

有時當人們遇到問題時,他們會想;我知道,我會用正則表達式!現在他們遇到了兩個問題。 – Aistina 2010-03-14 16:29:44

+0

@Aistina:您應該將其作爲答案發布,以便我可以降低評分。 – 2010-03-14 16:34:11

+0

@Alan:因爲...? – Aistina 2010-03-14 16:38:58