php中的反向preg_replace


reverse preg_replace in php

例如,我需要删除'DIFadd{和最后一个}(即'DIFadd{之前的}This is a string with} }df} some text'DIFadd{和输出应为This is a string with} }df some text

$str=''DIFaddbegin 'begin{align*}
'begin{pmatrix}
y_{1}''
y_{2}''
y_{3}}'''DIFadd{
e_{5}
'end{pmatrix}}''
'DIFadd{'mathbf{y}'quad }&'DIFadd{= 'quad 'mathbf{'tau} ' 'quad 'mathbf{e}.
}'end{align*}';

预期输出:

'DIFaddbegin 'begin{align*}
'begin{pmatrix}
y_{1}''
y_{2}''
y_{3}''
e_{5}
'end{pmatrix}''
'mathbf{y}'quad &= 'quad 'mathbf{'tau} ' 'quad 'mathbf{e}.
}'end{align*}

那么,如何从后面preg_replace,以便替换字符串}'DIFadd{我试过了,$str=preg_replace('/}(.*?)''''DIFadd{/',"$1",$str);//but its not getting last }

要做到这一点,您需要一个递归模式来找到好的结束花括号:

$str = preg_replace('~'''DIFadd{([^{}]*(?:{(?1)}[^{}]*)*+)}~', '$1', $str);

详细信息:

~
'''DIFadd{
(                   # capture group 1
    [^{}]*          # all that is not a bracket
    (?:             # eventually followed by an opening bracket
        { (?1) }    # (?1) refers to the subpattern of capture group 1
        [^{}]*
    )*+
)
}
~

由于(?1)是在其自身(捕获组1)内部调用的,因此它是一个递归。

注意:如果嵌套了'DIFadd{...},则必须将替换放入do..while循环中,并使用preg_replace计数参数:

do {
    $str = preg_replace('~'''DIFadd{([^{}]*(?:{(?1)}[^{}]*)*+)}~', '$1', $str, -1, $count);
} while ($count);
$text="
Pa pa pa pa -
Papa oom ma mow mow
Papa oom mow mow
Pa pa pa oom ma ma ma mow
Papa oom mow mow
";
$text = explode(' ', $text);
$text = array_reverse($text);
$text = implode(' ', $text);
$text = preg_replace('%mow%i','',$text,2);
$text = explode(' ', $text);
$text = array_reverse($text);
$text = implode(' ', $text);
echo $text;

之前:

Pa pa pa pa -
Papa oom ma mow mow
Papa oom mow mow
Pa pa pa oom ma ma ma mow
Papa oom mow mow

之后:

Pa pa pa pa -
Papa oom ma mow mow
Papa oom mow mow
Pa pa pa oom ma ma ma mow
Papa oom