Модераторы: ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> очистить от ненужны атрибутов 
V
    Опции темы
Evghenusi
Дата 3.9.2011, 04:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


майский жук
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 3.8.2006
Где: Молдова, Кишинёв

Репутация: нет
Всего: 15



Ребята, может это вам под силу?
как оставить только один атрибут (colspan|rowspan) знаю, а как оба нет  smile 

исходный текст
Цитата
<td style="height: 20%" rowspan="3">1</td>
<td style="width: 50%" colspan="2">3</td>
<td colspan="2" style="width: 50%">3</td>
<td colspan="2" style="width: 50%" rowspan="3">3</td>
<td colspan="2" rowspan="3" style="width: 50%">3</td>
<td style="height: 20%">1</td>

получить
Цитата
<td rowspan="3">1</td>
<td colspan="2">3</td>
<td colspan="2">3</td>
<td colspan="2" rowspan="3">3</td>
<td colspan="2" rowspan="3">3</td>
<td>1</td>

Эта задачка задавалась в разделе php, но до сих пор не даёт мне покоя.
Кстати вот мой вариант, наверно кривоват, но всё что смог родить: 
Цитата
|<td[^>]+?((?:colspan|rowspan)="\d+")*+>|
http://regexr.com?2ujnq

неужели нельзя решить одним РВ?

Это сообщение отредактировал(а) Evghenusi - 3.9.2011, 04:13
PM WWW   Вверх
Pfailed
Дата 3.9.2011, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 6
Всего: 39



Именно для этой последовательности сгодится такой вариант
Код

s/\w+(?<!colspan|rowspan)="[^"]+"//g



--------------------
PM MAIL   Вверх
Evghenusi
Дата 3.9.2011, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


майский жук
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 3.8.2006
Где: Молдова, Кишинёв

Репутация: нет
Всего: 15



А если имеется html код в котором надо найти только теги <td> и очистить их, тогда как?

И если не трудно объясните пожалуйста работу вашего РВ?
слово перед которым нет (colspan|rowspan)="всё кроме кавычки" ?
PM WWW   Вверх
alezzz
Дата 3.9.2011, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 11
Всего: 14



Код

s/(?<=<td)((?:\s+(?:colspan|rowspan)="[^"]+")*)\s+\w+="[^"]+"/$1/g;

PM MAIL   Вверх
Evghenusi
Дата 3.9.2011, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


майский жук
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 3.8.2006
Где: Молдова, Кишинёв

Репутация: нет
Всего: 15



Огромное спасибо, то что надо!  smile  (+ в репу)
Буду несказанно рад, если ещё и объясните.
PM WWW   Вверх
Pfailed
Дата 3.9.2011, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 6
Всего: 39



alezzz, не работает

Код

$t = '<td style="width: 50%" rowspan="3" style="height: 50%">3</td>';
$t =~ s/(?<=<td)((?:\s+(?:colspan|rowspan)="[^"]+")*)\s+\w+="[^"]+"/$1/g;
print $t, "\n";

Имеем: <td rowspan="3" style="height: 50%">3</td>
Ожидалось: <td rowspan="3">3</td>



--------------------
PM MAIL   Вверх
alezzz
Дата 3.9.2011, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 11
Всего: 14



да, как всегда не все варианты опробовал, вобщем одним выражением сложно, легче вытянуть содержимое <td ... > и уже его чистить чем весь html-документ
PM MAIL   Вверх
Evghenusi
Дата 3.9.2011, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


майский жук
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 3.8.2006
Где: Молдова, Кишинёв

Репутация: нет
Всего: 15



Цитата(Pfailed @  3.9.2011,  13:11 Найти цитируемый пост)
alezzz, не работает....

точно, а счастье было так близко  smile 

Это сообщение отредактировал(а) Evghenusi - 3.9.2011, 13:47
PM WWW   Вверх
alezzz
Дата 3.9.2011, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 11
Всего: 14



Не стоит отчаиваться. smile

В предыдущем варианте мне мешал fixed-regexp в просмотре назад, а что если отталкиваться не от начинающего тега, а от завершающего? вобщем если внутри <td   > </td> нет других тегов, то можно такое попробовать:
Код

s#\s+(?:(?!colspan|rowspan)\w)+="[^"]+"(?=[^>]*>[^<]+</td>)##g;

PM MAIL   Вверх
Evghenusi
Дата 3.9.2011, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


майский жук
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 3.8.2006
Где: Молдова, Кишинёв

Репутация: нет
Всего: 15



вроде работает, хотя в отличии от Pfailed, я мог снова что-то упустить)
PM WWW   Вверх
Pfailed
Дата 3.9.2011, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 6
Всего: 39



Ну тут сам alezzz сказал в чём проблема его последнего варианта.
В обычном html вероятность нахождения тега внутри <td> весьма велика. Хотя с другой стороны нормальные люди html регулярками не парсят smile 
Мне стало интересно можно ли после осуществленной подстановки вернуть позицию в строке на начало этой подстановки. Если найти возможность это сделать, то задача бы легко решилась. Я задал вопрос по этому поводу на perlmonks


--------------------
PM MAIL   Вверх
Pfailed
Дата 3.9.2011, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 6
Всего: 39



И всё таки оно существует, решение этой задачи.
Код

s/
(?: <td | \G )           # либо начинается тег <td, либо мы в позиции, где _закончилась_ предыдущая замена
[^>]+?                   # любые символы, но не закрывающая скобка тега, вплоть до начала параметра
\K                       # не заменять всё что стоит левее
\w++(?<!rowspan|colspan) # имя параметра, но не rowspan и не colspan
="[^"]+"                 # значение параметра
//xg;


Не идеальное, но вроде как лучшее из представленных.



--------------------
PM MAIL   Вверх
Evghenusi
Дата 4.9.2011, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


майский жук
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 3.8.2006
Где: Молдова, Кишинёв

Репутация: нет
Всего: 15



а зачем сверхжадный квантификатор?
PM WWW   Вверх
Pfailed
Дата 4.9.2011, 07:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 6
Всего: 39



Потому что мы знаем, что если захватили слово, но там colspan или rowspan, то нет смысла уменьшать захваченное и пытаться найти "=" после этого.


--------------------
PM MAIL   Вверх
Pfailed
Дата 4.9.2011, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 6
Всего: 39



Сегодня регулярка немного изменилась
Код

s/
(?: <td | \G )           # либо начинается тег <td, либо мы в позиции, где _закончилась_ предыдущая замена
[^<>]+?                   # любые символы, но не закрывающая и не открывающая скобка тега вплоть до начала параметра
\K                       # не заменять всё что стоит левее
\w++(?<!rowspan|colspan) # имя параметра, но не rowspan и не colspan
="[^"]+"                 # значение параметра
//xg


Кстати, в php поддерживаются \K и \G?


--------------------
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




[ Время генерации скрипта: 0.0517 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.