2015-08-15 4 views
2

Итак, у меня есть некоторые идеи о том, как это сделать, и вынесли на борт некоторые из предложений кода; У меня есть файлы LaTeX с компонентами в форме {upper}{lower}, где upper может быть чем угодно, от простого текста до LaTeX, включая его собственные вложенные {} и lower, может быть пустым или существенным латексом. Желаемый вывод представляет собой пару строк PHP $upper и $lower, которые содержат только содержимое двух родительских фигурных скобок.Извлечь код из вложенных фигурных фигурных скобок, включая несколько внутренних фигурных скобок в PHP

$upperlowerQ='some string'; // in format {upper}{lower} 
$qparts=nestor($upperlowerQ); 
$upper=$qparts[0]; 
$lower=$qparts[1]; 


function nestor($subject) { 
    $result = false;  
    preg_match_all('~[^{}]+|\{(?<nested>(?R)*)\}~', $subject, $matches); 

    foreach($matches['nested'] as $match) { 
     if ($match != "") { 
      $result[] = $match; 
      $nesty = nestor($match); 
      if ($nesty) 
       $result = array_merge($result,$nesty); 
     } 
    } 
    return $result; 
} 

Эта функция работает около 95% моих данных (это верхний/нижний расщепление вызывается в цикле в течение примерно 1000 раз), но это не удается на несколько. Пример того, что он не на выглядит следующим образом:

{Draw an example of a reciprocal graph in the form $y=\frac{a}{x}$}{ 
\begin{tikzpicture} 
    \begin{axis}[xmin=-8,xmax=8,ymin=-5,ymax=12,samples=50,grid=both,grid style={gray!30},xtick={-8,...,8},ytick={-5,...,12},axis x line = bottom, 
     axis y line = left, axis lines=middle] 
    \end{axis} 
\end{tikzpicture}\par 
%ans: smooth reciprocal function plotted. 
} 

, который дает: $upperDraw an example of a reciprocal graph in the form $y=\frac{a}{x}$, как (это правильно), но $lower в a, что числитель дроби в верхней части ... любой идеи оценили. Это всегда $lower, что неправильно ... $upper кажется правильным.

+0

Что должно быть ниже? –

+0

'$ lower' должно быть' \ begin {tikzpicture} \ begin {axis} [xmin = -8, xmax = 8, ymin = -5, ymax = 12, samples = 50, grid = both, grid style = { серый! 30}, xtick = {- 8, ..., 8}, ytick = {- 5, ..., 12}, ось x строка = нижняя, ось y линия = левая, оси линии = средняя] \ end {axis} \ end {tikzpicture} \ par % ans: плавная взаимная функция на графике. ' – tornadof3

+0

Можете ли вы предоставить лучший ввод и что именно вы хотите совместить/извлечь. Независимая функция 'nesty',' nestor', которая включена в образец, и [производит этот вывод] (https://eval.in/417089). –

ответ

1

Для любых будущих читателей реакция @ Jonny5 выше работала отлично. eval.in


Добавлено от комментариев

Попробуйте использовать регулярное выражение like this:{((?:[^}{]+|(?R))*)} только для извлечения, что внутри внешнего {} и проверить, если ровно 2 детали подбираются возвращенного MatchCount из preg_match_all.

$upper = ""; $lower = ""; 

if(preg_match_all('/{((?:[^}{]+|(?R))*)}/', $str, $out) == 2) { 
    $upper=$out[1][0]; $lower=$out[1][1]; 
} 

См test at eval.in

+1

Пожалуйста, избегайте ссылок только на ответы. Они становятся бесполезными, когда связь ломается, и это происходит довольно часто. –

Смежные вопросы