2015-06-25 6 views
0

у меня есть это регулярное выражение:Regex с HTML-тегами

(\S+)=[""']?((?:.(?![""']?\s+(?:\S+)=|[>""']))+.)[""']? 

Это регулярное выражение извлечет имя тега и значения из строки HTML, все работает нормально, но, когда у меня есть один символ регулярное выражение будет ловить левую сторону цитаты и персонажа.

Это моя строка:

<select title="Campo" id="6:7" style="width: auto; cursor: pointer;" runat="server" controltype="DropDownList" column="Dummy_6"><option value="0">Value:0</option><option selected="selected" value='1'>Value:1Selected!</option></select> 

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

+2

Что ** Язык ** вы используете, и что точно вы пытаетесь соответствовать? Я бы рассмотрел использование анализатора вместо регулярного выражения для этой задачи. – hwnd

+7

[Не анализировать HTML с регулярными выражениями] (http://stackoverflow.com/a/1732454/1995300)! – helmbert

+0

C#, большое спасибо – VirtApp

ответ

0

Я думаю, вы пытаетесь что-то слишком сложное и, в конечном счете, неправильно, с вашим регулярным выражением.

Если вы хотите наивности разобрать атрибут HTML: это регулярное выражение должно сделать трюк:

(\S+)=(?:"([^"]+)"|'([^']+)') 

Обратите внимание, что он разбирает одиночные кавычки и двойные кавычки значения в различных ножкам регулярных выражений. Ваше регулярное выражение найдет, что в следующем коде: значение

<foo bar='fu"bar'> 

атрибута является fu, когда это действительно fu"bar.

+0

Как я могу использовать только две группы захвата? – VirtApp

+0

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

0

Есть более эффективные способы анализа HTML, но вот мой вопрос по вашему вопросу.

(?<attr>(?<=\s).+?(?==['"]))|(?<val>(?<=\s.+?=['"]).+?(?=['"])) 

Без имен групп захвата:

((?<=\s).+?(?==['"]))|((?<=\s.+?=['"]).+?(?=['"])) 

котировок включены:

((?<=\s).+?(?==['"]))|((?<=\s.+?=)['"].+?['"]) 

Обновление: Для более частого использования в углубленном, действительно дает HTML Agility Pack попробовать.

1

Вы должны использовать HTML-парсер для этой задачи, регулярное выражение не может правильно обрабатывать HTML.

собрать все имена тегов и атрибутов есть имена и значения, я рекомендую следующее HtmlAgilityPack на основе решения:

var tags = new List<string>(); 
var result = new List<KeyValuePair<string, string>>(); 
HtmlAgilityPack.HtmlDocument hap; 
Uri uriResult; 
if (Uri.TryCreate(html, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp) 
{ // html is a URL 
    var doc = new HtmlAgilityPack.HtmlWeb(); 
    hap = doc.Load(uriResult.AbsoluteUri); 
} 
else 
{ // html is a string 
    hap = new HtmlAgilityPack.HtmlDocument(); 
    hap.LoadHtml(html); 
} 
var nodes = hap.DocumentNode.Descendants().Where(p => p.NodeType == HtmlAgilityPack.HtmlNodeType.Element); 
if (nodes != null) 
    foreach (var node in nodes) 
    { 
     tags.Add(node.Name); 
     foreach (var attribute in node.Attributes) 
     result.Add(new KeyValuePair<string, string>(attribute.Name, attribute.Value)); 
    } 

enter image description here
enter image description here

+1

Мне самому нравится регулярное выражение, но это не является правильным решением для вашего случая. Вы даже можете использовать свое [регулярное выражение с небольшой модификацией] (http://goo.gl/2JFVqw), но это не самый подходящий инструмент. –