用正则表达式从html字符串中获取样式属性

本文关键字:获取 样式 属性 字符串 正则表达式 html | 更新日期: 2023-09-27 18:10:26

这是我的html字符串:

<p style="opacity: 1; color: #000000; font-weight: bold; font-style: italic; text-decoration: line-through; background-color: #ffffff;">100 gram n!uts</p>

我想获得font-weight值(如果有的话)。我如何用正则表达式做到这一点?

用正则表达式从html字符串中获取样式属性

这应该能解决问题

(?<=font-weight: )[0-9A-Za-z]+(?=;)

解释:

(?<=font-weight: )结果前的字符串必须是font-weight:

[0-9A-Za-z]+结果只包含字母和数字,至少一个

(?=;)结果后的第一个字符是;

代码:

string Pattern = @"(?<=font-weight: )[0-9A-Za-z]+(?=;)";
string Value = "<p style='"opacity: 1; color: #000000; font-weight: bold; font-style: italic; text-decoration: line-through; background-color: #ffffff;'">100 gram n!uts</p>";
string Result = Regex.Match(Value, Pattern).Value; //bold

如果您计划将来使用一些HTML解析器,您可能需要查看一下CsQuery。只需为您的解决方案安装NuGet包,并按照下面代码段所示的方式使用它。

var html = "<p style='"opacity: 1; color: #000000; font-weight: bold; font-style: italic; text-decoration: line-through; background-color: #ffffff;'">100 gram n!uts</p>";
var cq = CsQuery.CQ.CreateFragment(html);
foreach (var obj in cq.Select("p"))
{
    var style = string.Empty;
    var has_attr = obj.TryGetAttribute("style", out style);
    if (has_attr)
    {
       // Using LINQ and string methods
       var fontweight = style.Split(';').Where(p => p.Trim().StartsWith("font-weight:")).FirstOrDefault();
       if (!string.IsNullOrWhiteSpace(fontweight.Trim()))
           Console.WriteLine(fontweight.Split(':')[1].Trim());
       // Or a regex
       var font_with_regex = Regex.Replace(style, @".*?'bfont-weight:'s*([^;]+).*", "$1", RegexOptions.Singleline);
       Console.WriteLine(font_with_regex);
    }
}

请注意,现在运行regex替换是相当安全的,因为我们只有一个普通的短字符串,没有可选的引号,也没有标签需要注意。

如果你需要加载一个URL,使用

var cq = CsQuery.CQ.CreateFromUrl("http://www.example.com");

这确实比使用这个很难阅读的regex安全得多,并且很可能在大量输入文本时失败:

<p's[^<]*'bstyle="[^<"]*'bfont-weight:'s*([^"<;]+)