The OpenNET Project / Index page

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

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

"Вложеное регулярное выражение"  –1 +/
Сообщение от zhukovia email(ok) on 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) on 01-Апр-17, 01:25 
Да
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Вложеное регулярное выражение"  +/
Сообщение от михалыч (ok) on 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\>)||'

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "Вложеное регулярное выражение"  –1 +/
Сообщение от zhukovia email(ok) on 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&.

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

4. "Вложеное регулярное выражение"  –1 +/
Сообщение от zhukovia email(ok) on 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&.

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

5. "Вложеное регулярное выражение"  +/
Сообщение от михалыч (ok) on 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>|'

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "Вложеное регулярное выражение"  +/
Сообщение от zhukovia email(ok) on 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>


Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

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

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

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

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

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


  Закладки на сайте
  Проследить за страницей
Created 1996-2017 by Maxim Chirkov  
ДобавитьРекламаВебмастеруГИД  
Hosting by Ihor