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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> нужно составить regex или предложить вариант... 
:(
    Опции темы
DooZ
Дата 28.11.2008, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всем доброй ночи
нужен или регекс или предложить вариант как это сделать:

суть в следующем
есть контент нам нем все что угодно
мне надо удалить ВСЕ вставки типа: <span бла бла бла>блаблабла</span>
кроме вот такой части:
<span class="my_class">что угодно</span>

все усложняется из-за следующего
в контенте могут быть такие варианты:

<span class="aaa"><span class="my_class">бла бла бла<span class="zzz">бла бла бла</span> бла бла бла</span>

вообщем смысл такой что на странице удаляются все <span...>...</span> кроме того что мне нужен: <span class="my_class">что угодно</span>


есть идеи?
варианты:
$content =~ s|<span[^>]*?(?!class="my_class")[^>]*?>.*?</span>||igs;
$content =~ s|<span[^>]*?(^class="my_class")[^>]*?>.*?</span>||igs;
не пашут
PM MAIL   Вверх
DooZ
Дата 28.11.2008, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



помоему решил задачу

Код

    while ($content =~ m{(<span[^>]*?>)}ig)
    {
    my $found = $1;
    next if ($found =~ /class="my_class"/is);
    $content =~ s|$1.*?</span>||i;
    }    


если кто-то предложит другое, выкладывайте

Это сообщение отредактировал(а) DooZ - 28.11.2008, 02:13
PM MAIL   Вверх
amg
Дата 28.11.2008, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(DooZ @  28.11.2008,  01:40 Найти цитируемый пост)
все усложняется из-за следующего
в контенте могут быть такие варианты:
Так и что же нужно делать с подобными вариантами? (Когда нужные тэги находятся внутри других.)

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


Опытный
**


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

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



DooZ, эту задачу легче решить с помощью DOM, а не регулярок.
попробуйте HTML::TreeBuilder


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
ginnie
Дата 28.11.2008, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



sir_nuf_nuf, Вы правы, но позволю себе привести вариант с регулярным выражением и стеком.

Код

use strict;
use warnings;

my $string = '<span class="aaa"><span class="my_class">бла бла бла<span class="zzz">бла бла бла</span> бла</span> бла бла</span>';
my @stack;

sub check_span {
    my $tag = shift;
    if ($tag eq '</span>') {
        die 'unbalanced </span> tag' unless @stack;
        return(pop(@stack) ? '</span>' : '');
    }
    elsif ($tag =~ /class="my_class"/i) {
        push(@stack, 1);
        return $tag;
    }
    else {
        push(@stack, 0);
        return '';
    }
}

$string =~ s{(</?span.*?>)}{check_span($1)}iegs;
die 'unbalanced <span> tag' if @stack;
print $string, $/;


Это сообщение отредактировал(а) ginnie - 28.11.2008, 12:47


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
tolkien
Дата 2.12.2008, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот еще один вариант. Через замену и рекурсию.
Код

my $count = 0;
$s = q(asdasd<span class="aaa"><span class="my_class">бла2 бла2 бла2<span class="zzz">бла3 бла3 бла3</span> бла бла бла</span>asdasd</span>);

print $s,"\n";
$s =~ s#(<span [^>]*>|</span)#repl($1)#eg;
print $s,"\n";
$s = recur($s);
print $s,"\n";
$s =~ s#!?span\d+#span#g;
print $s,"\n";

sub recur
{
  my ($s) = @_;

  if ( $s =~ m#<span(\d+)[^>]*>(.*)</span\1>#g )
  {
    my ($head, $tail) = ($`, $');
    $s = $head.(recur($2)).$tail;
  }
  
  return $s;
}

sub repl
{
  my ($s) = @_;
  
  if ($s =~ m/<span /)
  {
    $count++;
    
    if ( $s =~ m/class="my_class"/ )
    {
      $s =~ s/span/!span$count/;
    }
    else
    {
      $s =~ s/span/span$count/;
    }
    
    return $s;
  }
  elsif ($s eq '</span')
  {
    $count--;
    return "</span".($count+1);
  }
  else
  {
    die;
  }
}

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


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

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


 




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


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

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