Как я могу написать регулярное выражение для захвата ссылок без текста ссылки? - PullRequest
1 голос
/ 10 мая 2009

Как я могу написать регулярное выражение для замены ссылок без текста ссылки, например:

<a href="http://www.somesite.com"></a>

с

<a href="http://www.somesite.com">http://www.somesite.com</a>

Это то, что я пытался сделать, чтобы захватить спички, а это не ловит никого. Что я делаю не так?

string pattern = "<a\\s+href\\s*=\\s*\"(?<href>.*)\">\\s*</a>";

Ответы [ 4 ]

8 голосов
/ 10 мая 2009

Я бы не использовал регулярное выражение - я бы использовал Html Agility Pack и запрос вроде:

foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[.='']")) {
    link.InnerText = link.GetAttribute("href");
}
2 голосов
/ 10 мая 2009

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

string pattern = @"<a\s+href\s*=\s*""(?<href>.*?)"">\s*</a>";

(Я также изменил тип строкового литерала, чтобы использовать @, для лучшей читаемости.)

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

1 голос
/ 10 мая 2009

Я бы предложил

string pattern = "(<a\\b[^>]*href=\"([^\"]+)\"[^>]*>)[\\s\\r\\n]*(</a>)";

Таким образом, также будут захвачены ссылки с их атрибутом href в другом месте.

Заменить на

"$1$2$3"

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

0 голосов
/ 10 мая 2009

Марк Грэвелл имеет правильный ответ, регулярные выражения в принципе плохо разбирают HTML (см. . Можете ли вы привести некоторые примеры того, почему трудно анализировать XML и HTML с помощью регулярных выражений? почему). См. Можете ли вы привести пример разбора HTML с вашим любимым парсером? для примеров использования различных парсеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...