Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

Допустим есть строка вида:
Код:

<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, 16:24   #2
iborisov
Пользователь
 
Регистрация: 09.12.2016
Сообщений: 13
Репутация: 10
По умолчанию

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

Код:

s/&p_not(.*?)p_not&//gs

iborisov вне форума   Ответить с цитированием
Старый 03.04.2017, 17:20   #3
zhukovia
 
Регистрация: 30.03.2017
Сообщений: 7
Репутация: 10
По умолчанию

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

Код:

s/&p_not(.*?)p_not&//gs

Нет это не то. При этом удалится все что находиться внутри &p_not&, а надо удалить только тэги <p>. Результат должен быть таким
Код:

<p>привет</p> привет1 привет2 <p>привет10</p>

zhukovia вне форума   Ответить с цитированием
Старый 03.04.2017, 17:22   #4
zhukovia
 
Регистрация: 30.03.2017
Сообщений: 7
Репутация: 10
По умолчанию

На другом форуме предложили решение, но оно работает если только одна строка.
Код:

#!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, 06:49   #5
zhukovia
 
Регистрация: 30.03.2017
Сообщений: 7
Репутация: 10
По умолчанию

Вот рабочий вариант.
Код:

s {(&p_not&)(.+?)\1}{($x=$2)=~s[</?p>][]mgs; $x }mgse

zhukovia вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Регулярное выражение 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 22:36


12:38.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru