2014-10-17 3 views
0

Ahoy,Regex для анализа и замены img src в C# /. NET?

У меня проблема, см. У меня есть строки, как:

<img width="594" height="392" src="/sites/it_kb/SiteAssets/Pages/exploding%20the%20VDI%20vDesktop/VDI3.PNG" alt="" style="margin:5px;width:619px;height:232px" />

Они не последовательно отформатированный.

мне нужно разобрать строки, как это и возвращает следующее:

<img width="594" height="392" src="/exploding%20the%20VDI%20vDesktop-VDI3.PNG" alt="" style="margin:5px;width:619px;height:232px" />

Изменения:

  1. Удалить все, кроме непосредственного каталога, в котором лежал файл изображения.
  2. Вместо этого каталога, являющегося поддиректорией, добавьте его в имя файла.

Так что, если файл находится в настоящее время в /blabla/bla/blaaaaah/pickles/pickle.png

я хочу, чтобы IMG SRC атрибут сказать соленья-pickle.png

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

Таким образом, я прошу это замечательное сообщество для двух вещей:

  1. Как бы вы это сделали? Правильное ли регулярное выражение? Мне нужно иметь возможность анализировать любые атрибуты SRC внутри тегов IMG (независимо от того, имеют ли они высоту/ширину или другие атрибуты).
  2. Какие ресурсы вы бы рекомендовали мне изучить регулярное выражение с .NET?

Теперь для задачи под рукой, я полагаю, я мог бы сделать string.replace, где я ....

  1. Найти тег IMG, и получить индексы окружающих «<» и ' >»
  2. Найти индекс„SRC =“и„“(пробел) между этими двумя экземплярами
  3. Найти последний индекс„/“между СРК и космических индексов
  4. Найти второй по последнему показателю„/“ между индексами src и пробелом
  5. Замените ... er no, удалите ... все до второго до последнего экземпляра '/' ...
  6. ... String.Replace Остальные '/' с '-'.
  7. .... Я .. Думаю, что бы так?

Но DAMN, который является уродливым. Регулярное выражение было бы намного красивее, не так ли?

Любые советы?

Примечание: Я отметил это как «домашнее задание», но это не домашнее задание. Я волонтерскую для работы после работы, чтобы сохранить компанию, как 200k.Это буквально последний кусочек невероятно запутанной (для меня) головоломки. Конечно, я не вижу ни копейки этих 200 тыс., Но я выгляжу хорошо.

+0

Вы можете разобрать HTML с использованием регулярных выражений, но это не лучшая практика. См. [Этот ответ] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454), почему вы должны это делать. –

ответ

0
(?<=src=)"[^" ]*\/(?=[^\/"]*\/) 

Попробуйте это. Заполните empty string.

http://regex101.com/r/dZ1vT6/50

Должен предупредить вас, его вид hack.Html не должен быть проанализирован с регулярным выражением.

+0

Это довольно опасно, учитывая, что у других вещей может быть/в них вы должны добавить «src =» infront – Vajura

+0

@Vajura он будет нацелен только на 'src =" "'. – vks

+0

да это работает для первой части, я догадываюсь – Vajura

3

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

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

HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(html); 
var imgs = doc.DocumentNode.SelectNodes("//img"); 

использовать что-то вроде этого, чтобы получить/установить атрибуты:

foreach (var img in imgs) 
{ 
string orig = img.Attributes["src"].Value; 
//do replacements on orig to a new string, newsrc 
img.SetAttributeValue("src",newsrc); 
} 

Итак, какого рода замены вы должны делать? Я согласен с тем, что использование Regex намного более элегантно. Такие вещи, как они, в конце концов!

Что-то вроде этого следует сделать трюк:

string s = @"/sites/it_kb/SiteAssets/Pages/exploding%20the%20VDI%20vDesktop/VDI3.PNG"; 
string n = Regex.Replace(s,@"(.*?)\/([^\/]*?)\/([^\/]*?)$",@"/$2-$3"); 

Некоторые ресурсы, которые вы можете использовать, чтобы узнать C# Regexing:

dotnetperls Regex.Match

MSDN: Regex.Match method

MSDN Regex Cheat Sheet

0

Заменить этот

(?i)(?<=<img\s[\s\S]*?src=")(?:[^"]*\/)+(?=[^"]*\/)([^\/]*)\/([^"]+) 

To:

/$1-$2 
Смежные вопросы