我有一个像这样的字符串:
<p>1</p><p><img src="https://somesite/1.png?x=1&y=2"></p>
<p>2</p><p><img src="https://somesite/2.png?x=1&y=2"></p>
<p>3</p><p><img src="https://somesite/3.png?x=1&y=2"></p>
这是Kendo UI's editor的结果。
我希望所有图像 src 都附加一个诸如 &tick=2342342343 之类的勾号(因为我正在尝试解决像 this one from another stackoverflow 这样的缓存问题)
所以输出看起来像这样:
<p>1</p><p><img src="https://somesite/1.png?x=1&y=2&tick=2342342343"></p>
<p>2</p><p><img src="https://somesite/2.png?x=1&y=2&tick=2342342343"></p>
<p>3</p><p><img src="https://somesite/3.png?x=1&y=2&tick=2342342343"></p>
我认为 reg 表达式可能是一个好的开始:
var img = "img";
var imgRegExp = "<img src=\"[^\"]*\">";
Regex re = new Regex(imgRegExp);
if (editorText!=null && editorText.Contains(img))
{
//replace each editorText
}
答案 0 :(得分:1)
最后我选择了正则表达式。正如@Wiktor-Stribiżew 指出的那样,HTML 解析没有成功 - 我正在使用编辑器来生成少数标签。
private static void AppendQueryStringToIMG()
{
string output = "<p>1</p><p><img src=\"https://a_dynamic_environment.file.core.windows.net/some-proj/my-images/img__1.png?x=123&y=234\"></p><p>2</p><p><img src=\"https://a_dynamic_environment.file.core.windows.net/some-proj/my-images/img__2.png?x=123&y=234\"></p><p>3</p><p><img src=\"https://a_dynamic_environment.file.core.windows.net/some-proj/my-images/img__3.png?x=123&y=234\"></p>";
if (output != null && output.Contains("img"))
{
var m = Regex.Match(output, "<img .*?src=\\\"(.*?)\\\"");
while (m.Success)
{
var href = m.Groups[1].Value;
output = output.Replace(href, href + "&ticks=" + DateTimeOffset.UtcNow.Ticks);
m = m.NextMatch();
}
}
//output:
//string with &tick=1231231231 at the end of each img
}
答案 1 :(得分:1)
我加入评论说,如果 HTML 输出发生变化,HTML 可能会更改,并且正则表达式可能会突然不再起作用。但有时正则表达式比加载完整的解析器更有效。所以这取决于更改的风险,如果是这样,您是否可以控制这些更改? (更新剑道UI等)
对于正则表达式解决方案,为什么不试试这个:https://regex101.com/r/nJ3CL8/1
您可以直接从 regex101 保存的示例中生成代码。
我对快速解决方案的想法:
=
标志附近!<IMG Src="..." />
img
和 src
之间的任何类型的其他属性,因此也可以捕获它。src
属性。模式和替换字符串在 C# 中是这样的:
string pattern = @"<\s*img\s*([^>]*?)src\s*=\s*([""'])(.*?)\2";
string substitution = @"<img \1src=\2\3&tick=123456789\2";
说明:
\s*
表示任意空格,0 次或多次。[^>]*?
表示除 >
0 次或多次之外的任何字符,但不贪婪(搜索不远)。([^>]*?)
是在 src 属性之前捕获这些属性。它在替换模式中捕获 n°1 => \1
。(["'])
是捕获单引号或双引号。它是捕获 n°2 => 稍后重用。(.*?)
以非贪婪的方式捕获 src 值。这只是因为我使用了单/双引号的 \2
反向引用。