2015-08-31 3 views
1

Это мой HTML строка:Получить атрибуты стиля с регулярным выражением из 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> 

Я хочу, чтобы получить значение шрифта веса, если есть один. Как сделать это с помощью регулярного выражения?

+3

С помощью HTML Parser. Считаете ли вы его одним? –

+0

@stribizhev нет, мне нужно сделать это с помощью регулярного выражения –

+0

@petko_stankoski, почему ты * нужен * для этого с регулярным выражением? Регулярные выражения не могут анализировать каждый вход, а текст HTML - это один из случаев, когда разбор работает только в ограниченных случаях. –

ответ

2

это должно решить его

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

Explaination:

(?<=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 
0

Если вы планируете использовать некоторые 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); 
    } 
} 

Обратите внимание, что запуск замены регулярных выражений вполне в безопасности, так как у нас есть только простую короткая строка, без каких-либо дополнительных кавычек, ни теги заботиться.

Если вам нужно загрузить URL, используйте

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

Это действительно намного безопаснее, чем при использовании this regex, который трудно читать и, скорее всего, потерпит неудачу с огромным ввода текста:

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

Пожалуйста, проверьте мой ответ, я попытался предоставить как полный ответ, как мог. Конечно, есть и другие синтаксические анализаторы, которые вы можете рассмотреть: [HtmlAgilityPack] (https://htmlagilitypack.codeplex.com/), [Fizzler] (https://code.google.com/p/fizzler/), [Angle Sharp] (https://github.com/FlorianRappl/AngleSharp). Используйте регулярное выражение только тогда, когда это необходимо, а не только для каждой связанной с цепочкой задачи. Знаете, строки и струны. –

Смежные вопросы