Допустим есть строка вида:<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_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\>)||'
> Я ничего не понял.
> что в сухом остатке должно получиться?
> это -<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&.
> Я ничего не понял.
> что в сухом остатке должно получиться?
> это -<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&.
> Нет должно получиться <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> привет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>
попробуй это| perl -pe 's/(?\!^<.*?>.*?<.*?>)<.*?>(?=.*?&p_not&)|&p_not&//g' | perl -pe 's|^(<(.*?>).*?)(\s+.*)|$1</$2$3|'
от этих упреждающих проверок мозги закипят ))
Вообщем сделал вот так. Может кому понадобится.
s{(&p_not&)(.+?)\1}{($x=$2)=~s[</?p>][]mgs;$x}mgse
Спасибо большое за помощь.