Xpoint
   [напомнить пароль]

Регулярные выражения: удалить HTML-атрибуты, кроме одного

Метки: [без меток]
2013-02-13 17:47:09 [обр] ddd(0/36)[досье]

Добрый день!

Никак не получается составить регулярное выражение.

Есть html: <img alt="" src="images/ads_200x200.png" style="width: 250px; height: 250px; float:left; border-width: 1px; border-style: solid">
нужно найти все картинки с именем ads_200x200.png, удалить все атрибуты кроме src, и оставить float, если он указан в стилях.

Т.е. если флоат не указан, то результат должен быть такой:
<img src="images/ads_200x200.png">

А если указан, то такой:
<img src="images/ads_200x200.png" style="float:left">

Пытаюсь разобраться, но ничего не выходит :(

Спасибо!

спустя 4 часа 20 минут [обр] Филипп Ткачев(20/112)[досье]
XPath бы вам помог.
спустя 36 минут [обр] Jared(3/26)[досье]
ddd[досье], если вы у вас есть проблема и вы пытаетесь решить ее с помощью регулярок - у вас две проблемы.
Регулярки помогают при разборе html только в ограниченном количестве простых случаев - когда достаточно работать с разметкой только как с текстом. В вашем случае необходимо скормить код xml парсеру и преобразовывать уже получившийся документ (с помощью xslt, например). Все остальное - извращение.
спустя 18 часов [обр] Maus(0/3)[досье]
ddd[досье], если годится решение на 95% случаев, то
  1. напишите регулярку, которая детектит картинки с подходящим src, при этом оставшиеся части сохраняет в отдельные карманы.
  2. второй регуляркой проверяйте, что в оставшихся частях есть float (если да - то какой именно)
  3. собираете строку с тегом обратно
спустя 15 часов [обр] Jared(3/26)[досье]
Maus[досье] это ужастно, разбор HTML на таком уровне однозначно и просто решается с помощью XML парсеров и, в дальнейшем, инструметов работы с XML.
спустя 1 месяц 1 день [обр] ddd(0/36)[досье]

Maus[досье]

напишите регулярку, которая детектит картинки с подходящим src, при этом оставшиеся части сохраняет в отдельные карманы.

а как задетектить картинки с подходящими src?
почему-то паттерн '#<img.+src="(.*_ads_.*)".*>#sUi' для текста

<h1>
   вот это да !</h1>
<p>
   <img alt="" src="images/1.PNG" style="width: 333px; height: 498px;" /></p>
<p>
   <img src="/images/_ads_728x90.png" style="margin: 7px;" /></p>

 не работает корректно, выдает две картинки вместе с тегами p. :(

спустя 4 дня [обр] Jared(3/26)[досье]

ddd[досье] приведенный регэксп работает совершенно корректно. Он и должен брать эти ваши теги <p>

/<img\s[^>]+?img="[^"]*_ads_[^"]*"/

Заматчит

<img src="/images/_ads_728x90.png"'

В вашем регэкспе вот это - .* - жрет столько, сколько вообще в состоянии съесть. Читайте про жадность квантификаторов и классы симолов.
Заметьте, что для ограничения значения src могут использоваться одинарные кавычки, или не использоваться вообще никаких.

С помощью XPath все гораздо проще.

//img[contains(@src,'_ads_')]

Заматчит все нужные ноды.

Powered by POEM™ Engine Copyright © 2002-2005