$re = '/(?<!\\\\) # negative look-behind to make sure start is not escaped
(?: # start non-capture group for all possible match starts
# group 1, match dollar signs only
# single or double dollar sign enforced by look-arounds
((?<!\$)\${1,2}(?!\$))|
# group 2, match escaped parenthesis
(\\\\\()|
# group 3, match escaped bracket
(\\\\\[)|
# group 4, match begin equation
(\\\\begin\{equation\})
)
# if group 1 was start
(?(1)
# non greedy match everything in between
# group 1 matches do not support recursion
(.*?)(?<!\\\\)
# match ending double or single dollar signs
(?<!\$)\1(?!\$)|
# else
(?:
# greedily and recursively match everything in between
# groups 2, 3 and 4 support recursion
(.*(?R)?.*)(?<!\\\\)
(?:
# if group 2 was start, escaped parenthesis is end
(?(2)\\\\\)|
# if group 3 was start, escaped bracket is end
(?(3)\\\\\]|
# else group 4 was start, match end equation
\\\\end\{equation\}
)
))))/mx';
$str = 'sdfUma corda possui um movimento descrito pela seguinte função de onda: $$ y(x,t) = #x1# \\,\\hbox{sen}(\\frac{\\pi}{6}\\, x)\\,\\sin(#x2# t)\\,,\\;\\;\\hbox{com x e y em cm e t indo de 0 s a 10 s.} $$ A respeito deste movimento, alguém afirma: (i) $d$ A velocidade inicial de todos os pontos da corda é zero; (ii) A rapidez máxima de um ponto da corda é #f1# cm/s; (iii) O ponto da corda com $x=3$ cm não se move em nenhum instante.\\[sdf \\] \\begin{equation} sdfsdfsd \\end{equation}
Escolha essa função
$$Isso é um teste$$
';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php