Регулярное выражение для настройки HTML-hrefs в c#

#c# #regex

#c# #регулярное выражение

Вопрос:

Мне нужно использовать регулярное выражение для поиска в HTML-файле и замены href="pagename" на href="pages/pagename"

Также href может быть отформатирован как HREF = 'pagename'

Я не хочу заменять какие-либо hrefs, которые могут быть заглавными или строчными, начинающимися с http, ftp, mailto, javascript, #

Я использую C # для разработки этого небольшого приложения.

Комментарии:

1. Итак … вы хотите, чтобы кто-то другой написал ваше регулярное выражение за вас? Почему бы просто не потратить время, чтобы изучить это самостоятельно .

2. Очень редко использую regex. Потребовалось время для этого небольшого числа, поэтому я подумал, что отправлю свой первый SOS.

Ответ №1:

Манипулирование HTML с помощью регулярных выражений не рекомендуется, поскольку HTML не является «обычным языком». Я бы настоятельно рекомендовал вместо этого использовать HTML Agility Pack. Это дает вам DOM-интерфейс для HTML.

Комментарии:

1. 1/2, если бы я мог. Хотя вы правы в том, что html не является обычным языком, данная проблема не требует синтаксического анализа, этот конкретный случай может быть решен с помощью regex.

Ответ №2:

Я не тестировал во многих случаях, но в этом случае это сработало:

 var str = "href='page' href = 'www.goo' href='http://' href='ftp://'";
Console.WriteLine(Regex.Replace(str, @"href ?= ?(('|"")([a-z0-9_#.-] )('|""))", "x", RegexOptions.IgnoreCase));
  

Результат:

 "x x href='http://' href='ftp://'"
  

Вам лучше сохранить резервные копии файлов перед запуском этого: P

Ответ №3:

Существует множество предостережений при использовании поиска / замены с помощью HTML и XML. Проблема в том, что существует множество допустимых вариантов синтаксиса. (и многие из них запрещены, но все еще работают!)

Но, похоже, вы хотите что-то вроде этого:

поиск

 ([Hh][Rr][Ee][Ff]s*=s*['"])(w )(['"])
  

Это означает:

  • [Hh] : любой из элементов в квадратных скобках, за которым следует
  • s* : любое количество пробелов (возможно, ноль),
  • =
  • s* еще есть пробелы,
  • ['"] любой тип кавычек,
  • w : слово (без каких-либо косых черт или точек — если вы хотите включить, .html тогда используйте [.w] вместо этого),
  • и ['"] : еще одна цитата любого рода.

заменить на

 $1pages/$2$3
  

Что означает то, что указано в первой скобке, затем pages/ , затем то, что указано во втором и третьем наборах скобок.

Вам нужно будет поместить первую строку в кавычки @», а также экранировать двойные кавычки как "" . Обратите внимание, что это не даст ничего даже отдаленно разумного, например, проверки соответствия кавычек. Предупреждение: старайтесь никогда не использовать в качестве символа «любой символ» ( . ) в такого рода регулярных выражениях, поскольку это приведет к захвату больших фрагментов текста, включая следующие кавычки, возможно, до конца файла!

смотрите руководство по регулярным выражениям для получения дополнительной информации, например http://www.regular-expressions.info/dotnet.html