Регулярное выражение для замены вложеной структуры

firstzerg

Новичок
Регулярное выражение для замены вложеной структуры

Помогите пожалуйста составить регулярное выражение для поиска структуры в тексте:

"Мой текст ($name$) содердит вот такие строчки($nomyname($myvar1$)_($myvar2$)my$) ($myvar3$)"

у меня возникла проблема при составлении регулярного выражения ((
пока остановился на:

/\(\$(?!.*\(\$.*)(.*?)\$\)/s

но эта маска находит только одну структуру с конца, а надо чтоб находила

name , myvar1 , myvar2 , myvar3

Как сделать маску чтоб она находила сразу все невложенные структуры?

Заранее спасибо
 

WP

^_^
Задай вопрос правильно. Вряд ли кого-то интересуют бредовые
регулярки.
Если ты хочешь получить все последовательнсти вроде $name$ то ~\$\w+\$~.

Объясни словами что ты хочешь выделить из той строки.
 

firstzerg

Новичок
в том то и дело что выдераю из строки выражение которое начинается с ($ и заканчивается $) но из за того что они могут быть вложенными и их может быть несколько выдерается
из:
($name($value$)$)
это:
name($value

если использовать маску /\(\$(.*?)\$\)/i

P.S.
между ($ и $) может стоять все что угодно кроме их же
 

firstzerg

Новичок
это исключит из набора символов внутри ($ и $) все знаки ( и $
т.е. на ($ $50 $) не сработает - а должно, не должно срабатывать (или быть не верным) на ($ ($50 $)

PS чем отличаются / и ! и ~ (ограничители выражения) ?

левая и правые скобки обязательны
 

WP

^_^
> т.е. на ($ $50 $) не сработает - а должно,
Не понимаю тебя.

~\(\$[^\(]+\$\)~ Пойдет?

> PS чем отличаются / и ! и ~ (ограничители выражения) ?
Ничем.
 

firstzerg

Новичок
это не сработает на ($ это мой (мой текст) да! $)

формулирую:
надо выделить все строки подходящие по шаблону
~\(\$(.*)\$\)~s
но внутри не должно быть "($" и "$)"

примеры как должно, поидее, работать:

($ это мой (мой текст) да! $) -> "это мой (мой текст) да!"
($ это мой ($мой текст) да! $) -> "мой текст) да!"
($ это$) мой ($мой текст) да! $) -> "это" , "мой текст) да!"
($ ($это$) мой ($мой текст$) да! $) -> "это" , "мой текст"
 

firstzerg

Новичок
я просто хотел узнать.
Есть ли такая структура которая работает как [^asdf] но не на набор символов а на подстроки

З.Ы.
т.е. Одним регулярным выражением найти все строки подходящие по шаблону ~\(\$(.*)\$\)~s и чтобы внутри не было "($" и "$)" нельзя?

-~{}~ 11.02.07 05:55:

выражения на самом деле и так обрабатываются в 3 этапа
и выглядят вот так:

Переменая myvar ($myvar>=($myvalue$)?больше или равна ($myvalue$)^меньше ($myvalue$)$)
 

avenger_msoft

Новичок
Попробуй так:
PHP:
$s   = 'Мой текст ($name$) содердит вот такие строчки($nomyname($myvar1$)_($myvar2$)my$) ($myvar3$)';
$reg = '# \(\$ ( ( (?>( (?!( \(\$ | \$\) ) ) . )+ )  | (?R) )* ) \$\) #ix';

function test($s, &$result) {
	global $reg;
	if (preg_match($reg, $s)) {
		preg_match_all($reg, $s, $m);
		$m = $m[1];
		reset($m);
		foreach($m as $n => $v) {
			test($v, $result);
		}
	} else {
		$result[] = $s;
	}
}

echo "<pre>";
$result = array();
test($s, $result);
print_r($result);
Результат:
PHP:
Array
(
    [0] => name
    [1] => myvar1
    [2] => myvar2
    [3] => myvar3
)
 

WP

^_^
Улыбнуло =)
Во-первых reset($m); не нужно, т.к. указатель и так в начале. Во-вторых foreach делает копию. В-третьих решение подобно клейке обоев через замочную скважину - намного лучше (удобнее и главное производительнее) сделать без регулярных выражений.
 
Сверху