The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Вложеное регулярное выражение"
Вариант для распечатки  
Пред. тема | След. тема 
Форум WEB технологии (Perl)
Изначальное сообщение [ Отслеживать ]

"Вложеное регулярное выражение"  +/
Сообщение от zhukoviaemail (ok), 31-Мрт-17, 05:19 
Допустим есть строка вида:

<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& может быть не одна. Есть ли вообще такая возможность?

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по ответам | RSS]

1. Сообщение от Led (ok), 01-Апр-17, 01:25   +1 +/
Да
Ответить | Правка | Наверх | Cообщить модератору

2. Сообщение от михалыч (ok), 01-Апр-17, 08:35   +/
> Допустим есть строка вида:
> <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& может быть не
> одна. Есть ли вообще такая возможность?

Я ничего не понял.
что в сухом остатке должно получиться?
это -

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

?
тогда так:

echo '<p>привет</p> &p_not& <p>привет1</p> <p>привет2</p> &p_not& <p>привет10</p>' | perl -pe 's|(?<=\<\/p\>).*&p_not&.*&p_not&.*(?=\<p\>)||'

Ответить | Правка | Наверх | Cообщить модератору
Ответы: #3, #4, #9

3. Сообщение от zhukoviaemail (ok), 01-Апр-17, 14:11   –1 +/
> Я ничего не понял.
> что в сухом остатке должно получиться?
> это -
<p>привет</p><p>привет10</p>

> ?
> тогда так:
> echo '<p>привет</p> &p_not& <p>привет1</p> <p>привет2</p> &p_not& <p>привет10</p>'
> | perl -pe 's|(?<=\<\/p\>).*&p_not&.*&p_not&.*(?=\<p\>)||'

Нет должно получиться <p>привет</p> привет1 привет2 <p>привет10</p>
Т.е. убрать теги у тех слов что находятся внутри &p_not&.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #2

4. Сообщение от zhukoviaemail (ok), 01-Апр-17, 14:11   –1 +/
> Я ничего не понял.
> что в сухом остатке должно получиться?
> это -
<p>привет</p><p>привет10</p>

> ?
> тогда так:
> echo '<p>привет</p> &p_not& <p>привет1</p> <p>привет2</p> &p_not& <p>привет10</p>'
> | perl -pe 's|(?<=\<\/p\>).*&p_not&.*&p_not&.*(?=\<p\>)||'

Нет должно получиться <p>привет</p> привет1 привет2 <p>привет10</p>
Т.е. убрать теги у тех слов что находятся внутри &p_not&.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #2 Ответы: #5

5. Сообщение от михалыч (ok), 01-Апр-17, 18:45   +/
> Нет должно получиться <p>привет</p> привет1 привет2 <p>привет10</p>
> Т.е. убрать теги у тех слов что находятся внутри &p_not&.

если теги не p работать не будет ))
| perl -pe 's/&p_not&|<.*?>//g' | perl -pe 's|(^\S+)(\s+.*\s+)(\S+$)|<p>$1</p>$2<p>$3</p>|'

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #4 Ответы: #6

6. Сообщение от zhukoviaemail (ok), 03-Апр-17, 16:25   +/
>> Нет должно получиться <p>привет</p> привет1 привет2 <p>привет10</p>
>> Т.е. убрать теги у тех слов что находятся внутри &p_not&.
> если теги не p работать не будет ))
> | perl -pe 's/&p_not&|<.*?>//g' | perl -pe 's|(^\S+)(\s+.*\s+)(\S+$)|<p>$1</p>$2<p>$3</p>|'

Не знаю почему, но произошла обратная ситуация теги вне скобок удвоились
<p><p>hello</p></p> &p_not& <p>hello1</p> <p>hello2</p> &p_not& <p><p>hello10</p></p>


Ответить | Правка | Наверх | Cообщить модератору
Родитель: #5 Ответы: #7

7. Сообщение от михалыч (ok), 03-Апр-17, 18:26   +/
попробуй это
| perl -pe 's/(?\!^<.*?>.*?<.*?>)<.*?>(?=.*?&p_not&)|&p_not&//g' | perl -pe 's|^(<(.*?>).*?)(\s+.*)|$1</$2$3|'

от этих упреждающих проверок мозги закипят ))
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #6 Ответы: #8

8. Сообщение от zhukoviaemail (ok), 05-Апр-17, 05:48   +/
Вообщем сделал вот так. Может кому понадобится.
s{(&p_not&)(.+?)\1}{($x=$2)=~s[</?p>][]mgs;$x}mgse
Спасибо большое за помощь.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #7

9. Сообщение от fred (??), 06-Мрт-26, 17:35   +/
#!/usr/bin/env perl

use strict;
use warnings;

# <p>hello</p> hello1 hello2 <p>hello10</p>
my $x;
$_ = "<p>hello</p> &p_not& <p>hello1</p> <p>hello2</p> &p_not& <p>hello10</p>
&p_not& <p>hello3</p> <p>hello4</p> &p_not& <p>hello15</p>";
s#&p_not& <p>(.*?)</p> <p>(.*?)</p> &p_not&#$1 $2#g;

print $_,"\n";


Ответить | Правка | Наверх | Cообщить модератору
Родитель: #2


Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2026 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру