c# - 将查询字符串附加到字符串中的 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
}
解决方案
我加入评论说如果 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
了单/双引号的反向引用。
推荐阅读
- php - 无法更改 WordPress 预览帖子链接(带有 preview_post_link)
- python - 从一列和一行创建矩阵
- matlab - MATLAB FFT 练习题
- swift - CollectionView 标头 ReusableView
- git - 当数据几乎从不改变时,Git Repo 中的 BLOB 数据会那么糟糕吗?
- php - 我无法弄清楚为什么我的 UserModel 在 CodeIgniter 4 中出现错误
- r - 将值附加为 R 中的行
- xml - 为什么 getElementsByTagName 在 Visual Basic 中显示错误“不是 'XDocument 的成员”?
- loops - Tcl 访问循环项目项的内容
- python - 序列化器更新方法只返回字符串