Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Perl
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2017, 17:42   #1
zhukovia
 
Регистрация: 30.03.2017
Сообщений: 7
По умолчанию Вложеное регулярное выражение

Допустим есть строка вида:
Код:
<p>привет</p> &p_not& <p>привет1</p> <p>привет2</p> &p_not& <p>привет10</p>
Можно ли как то составить регулярное выражение чтобы удалить все теги <p> и </p> заключенные между &p_not& (удалить вместе с &p_not&), но при этом оставить <p> и </p> которые не входят в "скобки" &p_not&? Текст может быть очень длинным и "скобок" &p_not& может быть не одна. Есть ли вообще такая возможность?
zhukovia вне форума Ответить с цитированием
Старый 03.04.2017, 15:24   #2
iborisov
Пользователь
 
Регистрация: 09.12.2016
Сообщений: 13
По умолчанию

Если я правильно понял, что нужно, то вот так, вроде бы, должно работать:

Код:
s/&p_not(.*?)p_not&//gs
iborisov вне форума Ответить с цитированием
Старый 03.04.2017, 16:20   #3
zhukovia
 
Регистрация: 30.03.2017
Сообщений: 7
По умолчанию

Цитата:
Сообщение от iborisov Посмотреть сообщение
Если я правильно понял, что нужно, то вот так, вроде бы, должно работать:

Код:
s/&p_not(.*?)p_not&//gs
Нет это не то. При этом удалится все что находиться внутри &p_not&, а надо удалить только тэги <p>. Результат должен быть таким
Код:
<p>привет</p> привет1 привет2 <p>привет10</p>
zhukovia вне форума Ответить с цитированием
Старый 03.04.2017, 16:22   #4
zhukovia
 
Регистрация: 30.03.2017
Сообщений: 7
По умолчанию

На другом форуме предложили решение, но оно работает если только одна строка.
Код:
#!perl
 
use strict;
use warnings;
 
my $txt = '<p>привет</p> &p_not& <p>привет1</p> <p>привет2</p> &p_not& <p>привет10</p> &p_not& <p>привет1</p> <p>привет2</p> &p_not& <p>привет11</p>';
 
$txt =~ s/((&p_not&)(.+?)\2)/@{[func($3)]}/mg;
 
print "$txt\n";
 
sub func {
    my $txt = shift;
    $txt =~ s/<\/?p>//mg;
    return $txt;
}
zhukovia вне форума Ответить с цитированием
Старый 05.04.2017, 05:49   #5
zhukovia
 
Регистрация: 30.03.2017
Сообщений: 7
По умолчанию

Вот рабочий вариант.
Код:
s {(&p_not&)(.+?)\1}{($x=$2)=~s[</?p>][]mgs; $x }mgse
zhukovia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Регулярное выражение cashmail PHP 3 02.05.2014 14:05
Регулярное выражение KoBaL PHP 0 12.01.2014 13:19
Регулярное выражение i2save Общие вопросы Delphi 2 21.02.2013 16:29
Регулярное выражение. hacker_007 Общие вопросы Delphi 0 17.08.2012 19:05
Регулярное выражение kpachbiu PHP 2 08.02.2011 21:36