例如,我需要删除'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