首页 > 解决方案 > 将查询字符串附加到字符串中的 img 标签

问题描述

我有一个这样的字符串:

<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 的编辑器的结果。

我希望所有图像 src 都附加一个类似于 &tick=2342342343 的刻度(因为我正试图从另一个 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
}

标签: c#regexstring

解决方案


我加入评论说如果 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了单/双引号的反向引用。

推荐阅读