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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изобретаем велосипед, Замена тэгов с вложенностью 
:(
    Опции темы
MakTpaxep
Дата 5.7.2011, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всем привет.
Задача:
Код

<tag att="first">qwe<tag att="second">asd</tag>zxc</tag>

Заменить на:
Код

<first>qwe<second>asd</second>zxc</first>

В принципе, задача для какого-нибудь xml'ного модуля, но интересно можно ли сделать одним регом?
PM MAIL   Вверх
alezzz
Дата 5.7.2011, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


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

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



Код

while ($a =~ s#<tag att="([^"]*)">((?:.(?!<tag))*?)</tag>#<$1>$2</$1>#) {};

PM MAIL   Вверх
afiskon
Дата 5.7.2011, 11:54 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


Бывалый
*


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

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



Цитата(afiskon @  5.7.2011,  11:54 Найти цитируемый пост)
учите. мат. часть.

Основы я и так знаю, хорош тут тиц качать) И я, кстати, тоже готов убивать за [a-z] и [0-9] вместо \w и \d =)



Цитата(alezzz @  5.7.2011,  11:45 Найти цитируемый пост)
while ($a =~ s#<tag att="([^"]*)">((?:.(?!<tag))*?)</tag>#<$1>$2</$1>#) {};

Спасибо=)
PM MAIL   Вверх
arto
Дата 5.7.2011, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

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



# print '<tag att="first"><tag att="second">asd</tag>qwe<tag att="second">asd</tag>zxc</tag>' | perl -plne 'while (s#<tag att="([^"]*)">((?:.(?!<tag))*?)</tag>#<$1>$2</$1>#) {};'
<first><second>asd</first>qwe<second>asd</second>zxc</second>
# 


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


сплю...
**


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

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



Цитата(MakTpaxep @  5.7.2011,  12:25 Найти цитируемый пост)
И я, кстати, тоже готов убивать за [a-z] и [0-9] вместо \w и \d =)

почему?

Добавлено через 3 минуты и 25 секунд
arto, есть косяк.

(?:.(?!<tag))* -- вот эту часть не могу вспомнить как правильно сделать, у Фридла было как-то по другому.
PM MAIL   Вверх
afiskon
Дата 5.7.2011, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(alezzz @ 5.7.2011,  12:43)
Цитата(MakTpaxep @  5.7.2011,  12:25 Найти цитируемый пост)
И я, кстати, тоже готов убивать за [a-z] и [0-9] вместо \w и \d =)

почему?

Мне вот тоже интересно. Во-первых, [a-z0-9] не идентично \w. Во-вторых, \d в perl 5.14 и \d в perl < 5.14 работают по-разному, так что если нужен [0-9], лучше писать [0-9].
PM MAIL WWW   Вверх
MakTpaxep
Дата 5.7.2011, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(arto @  5.7.2011,  12:42 Найти цитируемый пост)
# print '<tag att="first"><tag att="second">asd</tag>qwe<tag att="second">asd</tag>zxc</tag>' | perl -plne 'while (s#<tag att="([^"]*)">((?:.(?!<tag))*?)</tag>#<$1>$2</$1>#) {};'<first><second>asd</first>qwe<second>asd</second>zxc</second># 

Действительно. Как мы это будем решать?
Или даже так
Код

<tag att="first"><tag att="second">asd</tag>qwe<tag att="second">asd<tag att="third">qwe</tag>asd</tag>zxc</tag>

У меня вроде появились мысли с использованием рекурсии и модификатором e.
Попробую сейчас оформить)

Цитата(alezzz @  5.7.2011,  12:43 Найти цитируемый пост)
почему?

Чтобы не раздувать код. Ещё когда utf8 входные - [a-z] не опишут всех букв) А [0-9] вроде эквивалентно \d, разве нет?

Это сообщение отредактировал(а) MakTpaxep - 5.7.2011, 12:56
PM MAIL   Вверх
alezzz
Дата 5.7.2011, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


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

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



Вот, кажется так точнее будет:
Код

while ($a =~ s#<tag att="([^"]*)">((?:(?!<tag).)*?)</tag>#<$1>$2</$1>#) {};

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

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



неужели сложно проверить?

# print '<tag att="first"><tag att="second">second 1</tag>first 1<tag att="second">second 2</tag>first 2</tag>' | perl -0777 -plne 's#<tag att="([^"]*)">((?:(?!<tag).)*?)</tag>#<$1>$2</$1>#gsm' 
<tag att="first"><second>second 1</second>first 1<second>second 2</second>first 2</tag>
#
PM MAIL ICQ   Вверх
alezzz
Дата 5.7.2011, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


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

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



и в каком месте ошибка?

Код

$a = '<tag att="first"><tag att="second">second 1</tag>first 1<tag att="second">second 2</tag>first 2</tag>';

while ($a =~ s#<tag att="([^"]*)">((?:(?!<tag).)*?)</tag>#<$1>$2</$1>#) {};
print $a;


Цитата

<first><second>second 1</second>first 1<second>second 2</second>first 2</first>


Добавлено через 2 минуты и 16 секунд
я не через /g делал, а в цикле

Это сообщение отредактировал(а) alezzz - 5.7.2011, 13:16
PM MAIL   Вверх
MakTpaxep
Дата 5.7.2011, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



alezzz, спасибо. 
PM MAIL   Вверх
MakTpaxep
  Дата 2.11.2011, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

    $_="<qwe att=2>aaaaa<qwe att=1>bbbbbbbbb</qwe>cccccc</qwe>";
    my $lev;
    $lev=qr(<qwe att=([^>]+)>((?:(?:(?!<qwe).)|$lev)+)</qwe>);
    s!$lev!<$1>$2</$1>!g;

Итого "<qwe att=2>aaaaa<1>bbbbbbbbb</qwe>cccccc</1>".
Почему не получается?

Пардон:
Код

$lev=qr(<qwe att=([^>]+)>((?:(?:(?!<qwe).)|(??{$lev}))+)</qwe>);

но тогда выходит
Код

<2>aaaaa<qwe att=1>bbbbbbbbb</qwe>cccccc</2>

Без while не обойтись видимо...

Это сообщение отредактировал(а) MakTpaxep - 2.11.2011, 19:05
PM MAIL   Вверх
alezzz
Дата 2.11.2011, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


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

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



без while этим способом не получится, модификатором global можно только ускорить
PM MAIL   Вверх
tishaishii
Дата 4.11.2011, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

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



Код
perl -MXML::LibXSLT

XML::LibXSLT->new->parse_stylesheet(XML::LibXML->load_xml(IO=>\*DATA))->transform(XML::LibXML->load_xml(IO=>\*STDIN))->toFH(\*STDOUT)

__DATA__
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="tag">
        <xsl:element name="{@att}">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="*">
        <xsl:value-of select="."/>
    </xsl:template>
</xsl:stylesheet>


Это сообщение отредактировал(а) tishaishii - 4.11.2011, 21:54
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

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


 




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


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

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