我正在尝试通过降价文件,替换所有图片网址。降价图片网址的格式为![alternative name](imageurl.png)
我的正则表达式搜索找到第一个,返回位置并替换它,然后我遍历文档直到我的正则表达式搜索找不到任何 - 即它的匹配维度数组为空。
问题是由于某种原因它继续匹配"我不知道是什么"。即,从正则表达式搜索返回的数组的长度永远不会为0
location := split[:locationSplit]
bodyRe := regexp.MustCompile(`!\[(.*)\]\((.*)\)`)
indexes := bodyRe.FindStringIndex(body)
fmt.Println("location: ", absoluteFileLocation)
fmt.Println("length: ", indexes)
for len(indexes) != 0 {
fmt.Println("length: ", len(indexes))
imageLocation := body[indexes[0]:indexes[1]]
body = body[:indexes[0]] + imageLocation + body[indexes[1]:]
indexes = indexes[:0]
fmt.Println("length: ", len(indexes))
indexes = bodyRe.FindStringIndex(body)
}
这将返回一个连续的:
length: 2
length: 0
length: 2
length: 0
length: 2
length: 0
length: 2
length: 0
length: 2
2来自循环内的indexes = bodyRe.FindStringIndex(body)
行,因为我之前将索引设置为0。
帮助表示赞赏
编辑:由于包含示例请求而编辑。上述方法显然存在缺陷,以下方法适用于第一张图像,但不适用于下一张图像
所以我尝试了这种技术:
(样本降价文件)
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]]
)会发生变化,因此它会在错误的位置替换第二个。
我需要这样做,以便在最终渲染降价时,图片网址指向可以从中提供服务的地方。
编辑:已修复
谢谢你们。 由于人们很难理解我想做什么,我怀疑我是以一种奇怪的方式解决问题。我已经有了它的工作,下面是代码片段,适用于任何其他人正在研究这个。
首先,我将解释我遇到问题的原因。 我想从网站本身的实际维护中分离出一个网站的博客文章。因此,博客作者'被告知在markdown写博客,所有图像标签的格式为`所有图像必须与降价文件本身在同一目录中。 因为此目录不是网站本身的代码库的一部分,所以图像URL需要替换为绝对URL,以便可以提供它们。我不希望这是博客作者需要担心的事情。
第一张图片的一切都运行正常,但是因为替换的绝对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 :(得分:0)
这一行之后:
imageLocation := body[indexes[0]:indexes[1]]
imageLocation
将包含类似![image](anImage.png)
的字符串。
body = body[:indexes[0]] + imageLocation + body[indexes[1]:]
在该行之后,身体将与以前相同。你基本上是从3个部分重建它。
这相当于做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"
}
在下一次迭代中,将再次找到相同的最左侧匹配,ad perpetuum。
您是否阅读了FindStringIndex
的文档?
如果您编辑问题以说出您尝试做的事情,我可以为您提供有效的代码段。