Что такое регулярное выражение и код C # для удаления любого HTML-тега, кроме ссылок? - PullRequest
0 голосов
/ 18 августа 2010

Я создаю пользовательскую функцию CLR в Sql Server 2005 для некоторой очистки многих таблиц базы данных.

Задача - удалить почти все теги, кроме ссылок (теги 'a' и их атрибуты 'href'). Поэтому я разделил проблему на два этапа. 1. создание пользовательской функции сервера sql и 2. создание сценария сервера sql для обновления всех задействованных таблиц, вызывающих функцию clr.

Для определяемой пользователем функции и учитывая ограниченную среду, я предпочитаю делать это с нативными библиотеками. Это означает, что, например, не используется пакет Html Agility Pack.

В javascript это регулярное выражение, по-видимому, делает правильную работу:

 <\s*a[^>]\s*href=(.*)>(.*?)<\s*/\s*a>

Как минимум, согласно http://www.pagecolumn.com/tool/regtest.htm

Но я не знаю, как перевести это (особенно часть групп захвата) в код C #, чтобы использовать текст как часть вывода.

Например, если введено: <a href="http://example.com">some text</a> Как сохранить текст "http://example.com" и "some text" как часть вывода в коде C # и в то же время убрать любой другой возможный HTML-тег (и их содержимое)?

Ответы [ 3 ]

0 голосов
/ 18 августа 2010

Ваше регулярное выражение совершенно неверно:

<\s*a[^>]\s*href=(.*)>(.*?)<\s*/\s*a>
      ↑            ↑
      1.           2.
  1. Это также приводит к совпадению <aa..., <ab..., <ac... и т. Д.
  2. Это заставляет вас переигрывать.Например, рассмотрим этот ввод:

    <a href='/one'>One</a> <a href='/two'>Two</a>
            ├───────────────────────────┤ ├─┤
                       group 1            grp2
    
0 голосов
/ 20 августа 2010

В конце. Я сделал отдельную консольную программу .net, сочетающую HtmlAgilityPack (HAP) и запрашивающую SQL Server оттуда. В программе я использовал наивное регулярное выражение для выделения фрагментов, а с помощью HAP я извлек href и якорные тексты, и с этим я сделал окончательную композицию, удалив любые другие символы, кроме текста, чисел и некоторых знаков пунктуации. 1001 *

0 голосов
/ 18 августа 2010

Не совсем как бомба, как у Джордана, но пример с использованием Матчей вместо:

var pattern = @"<.*href=""(?<url>.*)"".*>(?<name>.*)</a>";
var matches = Regex.Matches(input, pattern);
foreach (Match match in matches)
{
    var groups = match.Groups;
    Console.WriteLine("{0}, {1}", groups["url"], groups["name"]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...