Regex для выбора всех html-тегов изображения условно по значению src - PullRequest
2 голосов
/ 03 июня 2009

Мне нужно регулярное выражение, чтобы сделать следующее (к сожалению, это должно быть регулярное выражение, я не могу кодировать это, потому что он работает в купленном продукте):

Я хотел бы выбрать все теги изображений в фрагменте html, где либо тег изображения не содержит атрибута класса, либо, если он содержит атрибут класса, этот атрибут не содержит конкретной строки в начале , По сути, я хочу удалить (сопоставив) все теги изображений из фрагмента html, КРОМЕ для изображений с примененным к ним определенным классом.

Это могут быть два отдельных регулярных выражения - я просто хочу сопоставить их - без извлечения каких-либо данных.

Так, например, скажем, класс, который я хочу оставить, называется Pretty.

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

<img src="xx"/>
<img border="x" src="xx"/>
<img whatever other attributes src="xx"/>
<img class="ugly" src="xx"/>
<img whatever other attributes class="fugly" src="xx"/>

но не совпадает

<img class="Pretty" src="xx"/>
<img whatever other attributes class="Pretty" src="xx"/>
<img class="Pretty subpretty" src="xx"/>

Если это проще сделать в одном регулярном выражении (одно для сопоставления всех тегов изображения без атрибута класса и одно для сопоставления с тегами класса, которые не являются «симпатичными»), это тоже вполне нормально.

Ответы [ 4 ]

8 голосов
/ 03 июня 2009

Используйте XPath вместо этого, поскольку это то, для чего:

//img[not(contains(@class,'Pretty'))]

Это выражение XPath ищет каждый элемент img, атрибут которого class не содержит строку 'Pretty'. Я думаю, что это работает для элементов, в которых отсутствует атрибут class.

Парсинг XML и HTML с помощью регулярных выражений обычно очень плохая идея. Конечно, XPath работает, только если рассматриваемый HTML строгий. Если это недопустимый документ XML, вы можете захотеть вернуться к чему-то другому по умолчанию, но даже в этом случае регулярное выражение не подходит для работы.

Приложение: я ошибся, вернувшись к этому через 30 минут. Что-то подошло, и у меня нет времени, чтобы разобраться с этим. Если это не работает для элементов без атрибута class, используйте следующее выражение:

//img[(not(@class)) or (not(contains(@class,'Pretty')))]
2 голосов
/ 03 июня 2009

Немного быстро и грязно, но работает:

/(?!<img\b[^>]+\bclass="?[^>"]*\bPretty\b)<img\b[^>]*>/

Как это работает:

<img\b[^>]+\bclass="?[^>"]*\bPretty\b соответствует всем "красивым" изображениям.

<img\b[^>]*> соответствует всем изображениям. Таким образом, поместите вложенный шаблон «Pretty» в отрицательный взгляд перед вложенным шаблоном, чтобы соответствовать всем изображениям. Это будет соответствовать всем изображениям, за исключением тех, которые соответствуют симпатичному подшаблону.

1 голос
/ 04 июня 2009
<img(?:\s+(?:(?!class\b)\w+="[^"]*"|class="(?!Pretty)[^"]*"))*/>

Это похоже на ваш вопрос, но есть много деталей, которые вы не указали, например:

  • Являются ли имена тегов и атрибутов последовательно строчными?

  • Что если имя класса начинается с "pretty" (т. Е. Чувствительно ли оно к регистру)?

  • Значения атрибута всегда заключаются в кавычки и всегда заключаются в двойные кавычки?

  • Будут ли когда-нибудь дополнительные пробелы, например, вокруг "=" или перед финальным "/>"?

  • Поддерживает ли ваш "приобретенный инструмент" регулярные выражения с отрицательными взглядами?

0 голосов
/ 05 июня 2009

Да, всем тем, кто предложил мне использовать что-то иное, чем регулярное выражение, вы, конечно, правы, но я думаю, вы пропустили первое предложение в вопросе.

Я закончил тем, что нашел решение, Ник и Алан М выглядят ближе всего к этому, спасибо, ребята! К счастью, я могу использовать негативные взгляды, поэтому он отлично работает:)

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