如何使用RegEx将文本附加到锚点标记中的onClick属性

本文关键字:属性 onClick RegEx 何使用 文本 | 更新日期: 2023-09-27 18:15:27

场景A:

给定以下字符串:

<a href="#" name="xy" onclick="alert('hello');">test</a>

我想使用正则表达式(Replace(来附加一些文本(例如:alert('goodbey'(;(到onclick属性,最后得到一个如下所示的锚点标记:

<a href="#" name="xy" onclick="alert('hello');alert('goodbye');">test</a>

场景B:

给定以下字符串(注意onclick属性丢失(:

<a href="#" name="xy">test</a>

我想再次使用RegEx来确定onclick丢失,并插入具有某个值的属性(即:alert('hello'(;(到字符串中,最后显示一个锚标记,如下所示:

<a href="#" name="xy" onclick="alert('hello');">test</a>

我在c#中编码

我使用什么正则表达式来实现这一点?使用正则表达式是解决这个问题的好方法吗?

如何使用RegEx将文本附加到锚点标记中的onClick属性

这里有一个使用正则表达式的示例,它假设字符串将遵循示例中发布的格式,并且每个字符串不会有超过一个链接HTML标记-

void Main()
{
    //var link = "";
    var link = @"<a href=""#"" name=""xy"" onclick=""alert('hello');alert('goodbye');"">test</a>";
    var link2 = @"<a href=""#"" name=""xy"">test</a>";
    string s = AddJS(link,"alert('inserted');");
    string s2 = AddJS(link2,"alert('inserted');");
    Console.WriteLine(s);
    Console.WriteLine(s2);
}
string AddJS(string link,string js) {
    if (link.IndexOf("onclick") > -1) return Regex.Replace(link, "(onclick='".*)?('")(>)", @"$1" + js  + @""">");
    else return Regex.Replace(link, "(onclick='".*)?('")(>)", @""" onclick=""" + js + @""">");
}  

不需要正则表达式,假设格式很简单。

此代码在快速测试中运行良好:

string sHTML = "<a href='"#'" name='"xy'">test</a>"; //onclick='"alert('hello');'"
int pushAtIndex;
int index1 = sHTML.ToLower().IndexOf("onclick=");
if (index1 > 0)
{
    pushAtIndex = sHTML.IndexOf(";", index1) + 1;
    if (pushAtIndex < 0)
        pushAtIndex = sHTML.IndexOf("'"", index1) + 1;
    if (pushAtIndex < 0)
        pushAtIndex = sHTML.IndexOf("'", index1) + 1;
    if (pushAtIndex > 0)
        sHTML = sHTML.Insert(pushAtIndex, "alert('goodbye');");
}
else
{
    pushAtIndex = sHTML.IndexOf(">");
    if (pushAtIndex > 0)
        sHTML = sHTML.Insert(pushAtIndex, " onclick='"alert('goodbye');'"");
}
MessageBox.Show(sHTML);

这将只在字符串中查找onclick=,然后在分号之前加上alert(如果存在(,否则加上引号。如果没有找到onclick=,它将在锚的>之前推送整个onclick