Регулярное выражение для замены кавычек только в тегах HTML - PullRequest
3 голосов
/ 15 марта 2010

У меня есть следующая строка:

<div id="mydiv">This is a "div" with quotation marks</div>

Я хочу использовать регулярные выражения, чтобы вернуть следующее:

<div id='mydiv'>This is a "div" with quotation marks</div>

Обратите внимание, что атрибут id в div теперь окружен апострофами?

Как я могу сделать это с помощью регулярного выражения?

Редактировать: Я не ищу волшебную пулю, чтобы справиться с каждым крайним случаем в любой ситуации. Нам всем надоело использовать регулярные выражения для разбора HTML, но в данном конкретном случае и для моей особой необходимости регулярное выражение - это решение ... Мне просто нужна помощь, чтобы получить правильное выражение.

Редактировать # 2: Дженс помог мне найти решение, но любой, кто случайно заходит на эту страницу, должен долго и очень усердно думать об использовании этого решения. В моем случае это работает, потому что я очень уверен в типе строк, с которыми я буду иметь дело. Я знаю об опасностях и рисках, и обязательно сделаю это. Если вы не уверены, что знаете, то это, вероятно, означает, что вы не знаете и не должны использовать этот метод. Вы были предупреждены.

Ответы [ 3 ]

2 голосов
/ 15 марта 2010

Это можно сделать следующим образом: я думаю, что вы хотите заменить каждый экземпляр ", то есть между < и > на '.

Итак, вы ищите каждый " в вашем файле, ищите < и впереди >. Регулярное выражение выглядит так:

(?<=\<[^<>]*)"(?=[^><]*\>)

Вы можете заменить найденные символы по своему вкусу, например, используя Regex.Replace.

Примечание. Хотя я считаю, что сообщество Stack Overflow наиболее дружелюбно и полезно, на эти вопросы по Regex / HTML, по моему мнению, слишком много гнева. В конце концов, этот вопрос здесь не задает: «Какое регулярное выражение соответствует всему допустимому HTML и не соответствует ничему другому?»

0 голосов
/ 19 марта 2012

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

Используя HTML Agility Pack ( страница проекта , nuget ), это помогает:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml("your html here"); 
// or doc.Load(stream);

var nodes = doc.DocumentNode.DescendantNodes();

foreach (var node in nodes)
{
    foreach (var att in node.Attributes)
    {
         att.QuoteType = AttributeValueQuote.SingleQuote;
    }
}

var fixedText = doc.DocumentNode.OuterHtml;
//doc.Save(/* stream */);
0 голосов
/ 15 марта 2010

Вы можете соответствовать:

(<div.*?id=)"(.*?)"(.*?>)

и замените это на:

$1'$2'$3
...