2015-07-09 83 views
0

我正試圖通過降價文件,取代所有的圖像網址。縮減圖片url的格式是![alternative name](imageurl.png)正則表達式在所有網址上的降價網址在golang

我的正則表達式搜索找到第一個,返回位置並替換它,然後遍歷文檔,直到我的正則表達式搜索找不到任何 - 即它的匹配維數組是空。

問題是由於某種原因,它繼續匹配「我不知道是什麼」。即數組的長度從正則表達式搜索返回的是永遠不爲0

​​

這將返回一個持續:

length: 2 
length: 0 
length: 2 
length: 0 
length: 2 
length: 0 
length: 2 
length: 0 
length: 2 

2的來自我設置索引0循環內的線indexes = bodyRe.FindStringIndex(body)剛之前。

幫助讚賞

編輯:由於請求例如包括編輯。上述方法顯然是有缺陷的,這下面的方法適用於第一個圖像,而不是爲接下來的那些

所以我嘗試了這種方法:

(樣品降價文件)

some markdown 

![image](anImage.png) 

more markdown 

![image2](anImage2.png) 

more markdown & end of document 

和修改後的代碼:

... 
... 
    bodyRe := regexp.MustCompile(`!\[(.*)\]\((.*)\)`) 
    indexes := bodyRe.FindAllStringSubmatchIndex(body, -1) 

    for _, j := range(indexes) { //i is the index, j is the element (in this case j = []int) 
     imageLocation := body[j[4]:j[5]] 
     body = body[:j[4]] + "/App/Image/?image=" + location + "/" + imageLocation + body[j[5]:] 
    } 
    return body 

(要求輸出降價)

some markdown 

![image](/App/Image/?image=[location]/anImage.png) 

more markdown 

![image2](/App/Image/?image=[location]/anImage2.png) 

more markdown 
end of document 

而且適用於第一個圖像。但不是第二個。問題是(我認爲當該方法循環並替換第一個時,主體中的索引(即body[j[4]:j[5]])會發生更改,因此它會替換錯誤位置中的第二個索引。)

我需要這樣做當降價最終呈現的圖像的URL指向在那裏他們可以從被服務的地方

編輯:。固定

謝謝你們 由於事實,人們努力去理解什麼,我想做的事,我懷疑我正在以一種奇怪的方式解決這個問題,我已經開始工作了,下面是代碼片段,這個代碼片段適用於其他任何人查看這個代碼片段。

首先我會解釋爲什麼我有這個問題。 我想從網站本身的實際維護中分離出一個網站的博客寫作。因此,「博客作者」被告知以markdown編寫博客,所有圖片標籤的格式爲`所有圖片必須與降價文件本身位於同一目錄中。 因爲這個目錄不是網站本身的代碼庫的一部分,所以圖片網址需要用絕對網址替換,以便它們可以被投放。我不希望這是博客作者需要擔心的事情。

一切工作正常的第一個圖像,但因爲替換絕對URL改變了長度,因此博客內容中的所有字符的位置,正則表達式找到的索引,不再對齊,所以我不得不將新長度添加到匹配的索引。

adjustment := 0 
for _, j := range(indexes) { 
    imageLocation := body[j[4]+adjustment:j[5]+adjustment] 

    replacement := "?imageurl=" + url.QueryEscape(location) + "/" + imageLocation 
    body = body[:j[4] + adjustment] + replacement + body[j[5] + adjustment:] 
    adjustment += len(replacement) - len(imageLocation) 
} 
+0

我沒有時間深入研究,但如果停止重新使用「索引」片,會發生什麼情況?我非常懷疑這個代碼。只需一眼就能看到一堆重新切片,因爲我必須停下來思考每行代碼之後的集合是什麼樣的,這可能是您的錯誤發生的地方。 – evanmcdonnal

+0

是否可以根據樣本輸入和期望的輸出重新解決問題? –

+1

Markdown圖像鏈接也可以指定一個標題:'![alt text](/ path/to/img.jpg「Title」)'那麼稍後'![alt text] [id]'完全有效的降價怎麼辦? '[id]:/path/to/img.jpg「Title」'?試圖用正則表達式解析事情通常是困難和容易出錯的。當然,Go中必須有一個markdown解析器。 –

回答

0

這一行後:

imageLocation := body[indexes[0]:indexes[1]] 

imageLocation將包含類似![image](anImage.png)的字符串。

body = body[:indexes[0]] + imageLocation + body[indexes[1]:] 

在那一行之後,主體將和以前一樣。你基本上是從三個部分重新構建它。

這相當於做the following

package main 

import "fmt" 

func main() { 
    s := "Hello, playground" 
    t := s[2:4] 
    s = s[:2] + t + s[4:] 
    fmt.Println(s) // prints "Hello, playground" 
} 

在下一次迭代中,同樣最左邊的比賽將再次發現,廣告Perpetuum公司。

您是否閱讀過關於FindStringIndex的文檔?

如果您編輯您的問題以說出您正在嘗試執行的操作,我可以爲您提供一個工作代碼片段。

+0

我現在用一個工作版本更新了原來的問題。謝謝 – amlwwalker