正则表达式调整c#中的HTML hrefs

时间:2011-05-02 17:35:17

标签: c# regex

我需要使用正则表达式搜索html文件并将href="pagename"替换为href="pages/pagename"

此外,href的格式可以为HREF = 'pagename'

我不想替换任何以http,ftp,mailto,javascript开头的大写或小写的href,#

我正在使用c#来开发这个小应用程序。

3 个答案:

答案 0 :(得分:3)

不建议通过Regex进行HTML操作,因为HTML不是“常规语言”。我强烈建议您使用HTML Agility Pack。这为HTML提供了一个DOM接口。

答案 1 :(得分:0)

我没有对很多案例进行过测试,但对于这种情况,它有效:

var str = "href='page' href = 'www.goo' href='http://' href='ftp://'";
Console.WriteLine(Regex.Replace(str, @"href ?= ?(('|"")([a-z0-9_#.-]+)('|""))", "x", RegexOptions.IgnoreCase));

结果:

"x x href='http://' href='ftp://'"

您最好在运行此文件之前保留备份文件:P

答案 2 :(得分:0)

使用HTML和XML查找/替换时有很多警告。问题是,允许的语法有很多变化。 (许多不允许但仍然有效!)

但是,你似乎想要这样的东西:

搜索

([Hh][Rr][Ee][Ff]\s*=\s*['"])(\w+)(['"])

这意味着:

  • [Hh]:方括号中的任何项目,后跟
  • \s*:任意数量的空格(可能为零),
  • =
  • \s*任何更多的空格,
  • ['"]报价类型,
  • \w+:一个单词(没有任何斜线或点 - 如果您想包含.html,请改用[.\w]+),
  • ['"]:任何类型的引用。

替换为

$1pages/$2$3

这意味着第一个括号中的内容,然后pages/,然后是第二和第三组括号中的内容。

您需要将第一个字符串放在@“引号中,并将双引号转义为""。 请注意,它甚至不会做任何模糊的智能,比如确保引号匹配。警告:尝试永远不要在这种正则表达式中使用“任何字符”(.)符号,因为它会抓取大部分文本,包括下一个引号,可能直到文件末尾!

查看正则表达式教程以获取更多信息,例如http://www.regular-expressions.info/dotnet.html