2014-08-22 1 views
0

Я хочу удалить все, что ожидалось src в Image тег, используя regex.

Я использую C#, но я не хочу использовать HTMLAgilityPack Я хочу использовать его только с помощью регулярного выражения.

Как это получить?

Если String является <img id="image" class="header" src="test.png">, то он возвращается в <img src="test.png">

Тег изображения может содержать много других дополнительных свойств.Удалить все ожидают src в тегах изображений с помощью Regex

+2

«Я не хочу использовать HTMLAgilityPack, я хочу использовать его только с помощью регулярных выражений». Вы действительно должны объяснить, почему вы не хотите использовать то, что обычно является правильным инструментом для работы. В противном случае вы просите нас решить что-то, что совершенно хорошая библиотека уже разрешила, без всякой видимой причины. –

+0

@ dan1111 Обычно я согласен с вами. Однако это не совсем соответствует всей HTML-странице, но только внутри одного узла, который уже был извлечен. Кроме того, все, что требует соответствия, это 'src =" test.png ", потому что вы можете просто поместить это в новый тег HTML. Это ОЧЕНЬ простое совпадение: '' (src = \ ". * \") ". Если он не нуждается в HTMLAgilityPack для чего-либо еще, просто чтобы соответствовать этому одиночному тегу, я думаю, что было бы излишним добавить его только для этого единственного извлечения из одного узла. Однако, если ему нужно сделать больше, я согласен с тем, что он должен пойти на установленное решение. – Nzall

+0

@NateKerkhofs Если тег src не является последним тегом. Или использовать одинарные кавычки. – Rawling

ответ

0

Чтобы уточнить мои комментарии: Обычно я бы не рекомендовал разбор HTML с использованием Regex. однако это одно из немногих случаев, когда это возможно, не заканчивая катастрофически сложной строкой регулярного выражения, потому что здесь у вас есть единственный узел с одной парой соответствующих угловых скобок. Кроме того, OP требует только один тег из этой строки. Если бы ему нужно было сделать что-то более сложное, я бы согласился, что он должен использовать HTMLAgilityPack, но это вполне выполнимо.

Что вы делаете - вы извлекаете тег из строки, используя это регулярное выражение: (src=['\"].+?['\"]). Тогда вы берете то, что вы извлекли из строки и вставить его в новую строку:

String newImgTag = String.Format("<img {0}>", srcMatch); 

Опять же, если бы это было усложнять (или, если я должен был сделать другие манипуляции с HTML), я бы просто пропустить регулярное выражение и идти на установленные решения, как вышеупомянутый HTMLAgilityPack, потому что он предлагает гораздо больше поддержки HTML-манипуляции.

Однако я не рассматриваю это как манипуляцию с HTML, потому что у вас есть один тег без даже подходящего закрывающего тега. Это больше похоже на основные манипуляции с строками. Это похоже на вычисление числа на вторую мощность: я сомневаюсь, что кто-то будет импортировать всю математическую библиотеку только для этого, они просто сделают N * N.

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

+0

Я все еще не убежден. Это может нарушить самые разные способы (атрибут src в теге скрипта, сломанное содержимое в комментариях, страница с исходным кодом HTML и т. Д.) Возможно, она будет работать с входными данными OP, но опять же * возможно, не * , Мы не знаем достаточно о задаче - вот почему я попросил разъяснений. Я не категорически против использования регулярных выражений в HTML. Некоторые задачи требуют быстрого и грязного подхода. Но без дополнительной информации это не совсем понятно. Большинство людей, которые задают такие вопросы, действительно должны использовать парсер. –

+0

@ dan1111 Я согласен с вашим комментарием. Тем не менее, все, что у меня было, что я мог бы основать свой ответ, было в этой строке примера. Основываясь на том, что сказал OP (строка, содержащая один тег изображения с атрибутом src и любым количеством других атрибутов), для этого достаточно простое Regex. Не похоже, что он просит обработать все дерево элементов DOM с помощью Regex. У него также может быть законная причина не в синтаксическом анализе. Он может находиться в закрытой среде с синдромом «не придумано здесь». Он мог бы работать над очень небольшим проектом, где парсер резко увеличил размер проекта. – Nzall

Смежные вопросы