регулярные выражения - анализ и замена тегов

Denjs

Новичок
регулярные выражения - анализ и замена тегов

Пытаюсь анализировать "типа" - теги (объясню позже) и заменять отдельные из них на "пусто" с помощью регулярных выражений.

В общем есть собственоручные теги вида
PHP:
<user ivanov> </user ivanov>
пытаюсь определить его как
PHP:
"/(<(user ivanov)[^>]*>)(.*)(<\/\\2>)/"
но данное выражение сбивается при нескольких подряд идущих тегах. (см пример).

Подозреваю что вместо "(.*)"
надо сказать что-то типа "любая последовательность символов не содержащая (\\2) "
Как мне это сказать?


пример кода который показывает в чем проблема и что я хочу :
PHP:
$html='11<user ivanov>22</user ivanov>33 erus<user ivanov>44</user ivanov>55';
$req="/(<(user ivanov)[^>]*>)(.*)(<\/\\2>)/";
$changeto="-";

$html2=preg_replace ($req,$changeto,$html);

echo "Original string : <b>".htmlspecialchars($html)."</b><br>";
echo "Changed string : <b>".htmlspecialchars($html2)."</b><br>";
В общем выдается так :
-----------------------------------------
Original string : 11<user ivanov>22</user ivanov>33 erus<user ivanov>44</user ivanov>55
Changed string : 11-55
-----------------------------------------
а хочестя так :
Changed string : 11-33 erus-55
 

SiMM

Новичок
> но данное выражение сбивается при нескольких подряд идущих тегах.
hint: жадность
[m]reference.pcre.pattern.modifiers[/m]
[m]reference.pcre.pattern.syntax[/m]
 

Denjs

Новичок
Спасибо.
Заработало c "(.*?)"
PHP:
$req="/(<(user ivanov)[^>]*> )(.*?)(<\/\\2> )/";
===============
да... ларчик просто открывался.. а я 2 ночи искал =)

-~{}~ 15.09.05 01:00:

а вот в продолжение темы, как таки сказать "любая последовательность символов не содержащая подстроку".
Как определить все теги
PHP:
<user ivanov> ... </user ivanov>
внутри которых НЕ встречается тег IMG.
Например что бы в случе с програмой выше - из всех "user ivanov" оставить только структуры вида
PHP:
<user ivanov> ....bla-bla-bla.... <img ....ble-ble.... > ....blu-blu-blu...</user ivanov>
для симаола это понятно - все что угодно но не "знак больше
PHP:
([^>]*)
.
но написав типа
PHP:
([^(img)]*)
соответственно получаем, что все кроме самой строки "img" подпадает под шаблон...

Фраза вида
PHP:
(.*)([^(img)]*)(.*)
делает вид что под неё тоже все подпадает... я не в том направлении думаю?

Заренее спасибо =)
================
без..?... мерно счастливый ушел кропать дальше...
 

Profic

just Profic (PHP5 BetaTeam)
python
Чего? Этот кусок - мусор.

Denjs
Повторяю последний раз. Учись пользоваться поиском:
~(?:.(?!<img))+.~
 
Сверху