URL: https://ssl.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 8075
[ Назад ]

Исходное сообщение
"Вложеное регулярное выражение"

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


Содержание

Сообщения в этом обсуждении
"Вложеное регулярное выражение"
Отправлено Led , 01-Апр-17 01:25 
Да

"Вложеное регулярное выражение"
Отправлено михалыч , 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\>)||'


"Вложеное регулярное выражение"
Отправлено zhukovia , 01-Апр-17 14:11 
> Я ничего не понял.
> что в сухом остатке должно получиться?
> это -
<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&.


"Вложеное регулярное выражение"
Отправлено zhukovia , 01-Апр-17 14:11 
> Я ничего не понял.
> что в сухом остатке должно получиться?
> это -
<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&.


"Вложеное регулярное выражение"
Отправлено михалыч , 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>|'


"Вложеное регулярное выражение"
Отправлено zhukovia , 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>



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

от этих упреждающих проверок мозги закипят ))

"Вложеное регулярное выражение"
Отправлено zhukovia , 05-Апр-17 05:48 
Вообщем сделал вот так. Может кому понадобится.
s{(&p_not&)(.+?)\1}{($x=$2)=~s[</?p>][]mgs;$x}mgse
Спасибо большое за помощь.