将查询字符串附加到字符串中的 img 标签

时间:2021-02-26 10:56:51

标签: c# regex string

我有一个像这样的字符串:

<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
}

2 个答案:

答案 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="..." />
  • 它们可以是 imgsrc 之间的任何类型的其他属性,因此也可以捕获它。
  • 一个属性可以用单引号或双引号括起来,甚至什么都没有!我没有考虑这种情况,因为通常情况并非如此,通常是针对 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 反向引用。
相关问题