Модераторы: 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   Вверх
Evghenusi
Дата 4.9.2011, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Pfailed @  4.9.2011,  07:54 Найти цитируемый пост)
Кстати, в php поддерживаются \K и \G? 
запутался я, вопрос задавали в разделе JavaScript. В JS выдаёт ошибку  "invalid quantifier", либо у меня кривые руки, а в PHP (5.3) срабатывает на ура.

Цитата(Pfailed @  4.9.2011,  07:03 Найти цитируемый пост)
Потому что мы знаем, что если захватили слово, но там colspan или rowspan, то нет смысла уменьшать захваченное и пытаться найти "=" после этого. 
при тестировании убрал второй "+" и РВ не потеряло работоспособность, поэтому и спросил.

Спасибо за решение, для меня это был больше спортивный интерес.....пойду читать что такое "\K"  smile 
PM WWW   Вверх
alezzz
Дата 4.9.2011, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


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

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



Цитата(Evghenusi @  4.9.2011,  10:57 Найти цитируемый пост)
пойду читать что такое "\K"

почему-то perlretut не знает про \K, но судя по описанию Pfailed следующие выражения по смыслу одинаковы:
Код

s/\d+\K\D+//;
s/(\d+)\D+/$1/;

гараздо интереснее \G

Цитата(Evghenusi @  4.9.2011,  10:57 Найти цитируемый пост)
вопрос задавали в разделе JavaScript. В JS выдаёт ошибку  "invalid quantifier"

незнаю как для JS, в языках в которых нет встроенной поддержки РВ должно быть несколько библиотек для работы РВ. Читал что библиотеки для Java (а может VB, уже не помню) поддерживают любые выражения при просмотре назад.

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


Опытный
**


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

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



Цитата(Evghenusi @  4.9.2011,  10:57 Найти цитируемый пост)
при тестировании убрал второй "+" и РВ не потеряло работоспособность, поэтому и спросил.

Оно работает, но менее эффективно, будет 7 лишних возврата (или около того).
Можно добавить в скрипт 
Код

use re 'debugcolor';

и увидеть как работает со сверх жадным и просто жадным.
Я посмотрел и понял, что вся регулярка работает неэффективно. Написал еще 1 вариант, который мне больше нравится
Код

s/
(?: <td | \G )                       # beginning of the tag or pos()
(?:\s+(?:colspan|rowspan)="[^"]+")*+ # colspan or rowspan one or more times
\K                                   # do not replace any on the left side
\s+\w+                               # parameter name
="[^"]+"                             # parameter value
//xg;


Цитата(alezzz @  4.9.2011,  13:35 Найти цитируемый пост)
почему-то perlretut не знает про \K

В perlre есть и про \K и про \G. Я про них сам только вчера узнал толком, из моей темы с perlmonks.


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


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


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

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



Цитата(alezzz @  4.9.2011,  13:35 Найти цитируемый пост)
гараздо интереснее \G
 уже встречал до поднятия этой темы, в отличии от \K smile

оффтоп
Цитата(Pfailed @  4.9.2011,  13:54 Найти цитируемый пост)
....и увидеть как работает со сверх жадным и просто жадным.

а есть онлайн сервис где это можно наблюдать?, а то за перл ещё не скоро возьмусь  smile

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


сплю...
**


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

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



Цитата(Evghenusi @  4.9.2011,  16:53 Найти цитируемый пост)
а есть онлайн сервис где это можно наблюдать?

можно и оффлайн без глубоких знаний perl
возмите такой шаблон:
Код

use re 'debug';

my $s = "ab c";
$s =~ /\w+/;

и подставляйте в него нужные данные.

Это сообщение отредактировал(а) alezzz - 4.9.2011, 20:25
PM MAIL   Вверх
Evghenusi
Дата 4.9.2011, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



alezzz, я привык что для пхп надо Дэнвер (к примеру) запускать, ну или если что-то мелкое то проверить на http://codepad.org/ , но там надо вписать кроме кода <?php  ... ?> , а как работать с перл я не в зуб ногой, поэтому и спросил про онлайн сервис.
http://codepad.org/BKjp6kyr больше ничего не надо?
PM WWW   Вверх
dixoNICH
Дата 4.9.2011, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



ideone.com
PM MAIL   Вверх
alezzz
Дата 4.9.2011, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


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

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



Цитата(Evghenusi @  4.9.2011,  21:06 Найти цитируемый пост)
http://codepad.org/BKjp6kyr больше ничего не надо?

чем не вариант, можно и так.

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


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


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

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



Цитата(dixoNICH @  4.9.2011,  22:16 Найти цитируемый пост)
ideone.com 

спасибо. не встречал.

Цитата(alezzz @  4.9.2011,  22:41 Найти цитируемый пост)
чем не вариант, можно и так.

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


 




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


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

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