我有
$text='remove1 \solution{keep1} remove2 \solution{keep2 inner{text}} remove3';
并希望使用preg_replace来完成
\solution{keep1}\solution{keep2 inner{text}}
我几乎有一个使用
的解决方案$re = '/[^{}]*+(\{(?:[^{}]++|(?1))*\})[^{}]*+/';
$text = preg_replace($re, '$1', $text);
但这并没有将解决方案放在前面。我该如何解决这个问题?
编辑:\解决方案是一个要搜索的固定字符串,所有其他文本片段都是任意的。
答案 0 :(得分:1)
我认为应该删除remove1
等等,因为它们将空格与其余的字符串组件分开?我看不到任何其他规则来消除它们。所以你的角色类应该是[^{}\s]
。
此外,虽然它不会破坏正则表达式引擎,[^{}]*+
和[^{}]++
会大大减慢它的速度而不会产生任何影响。仅使用[^{}]*
或[^{}]+
。
在一段文本中找到所需的所有序列并将join
它们全部放在一起会容易得多。此代码显示了这个想法
$text = 'remove1 \solution{keep1} remove2 \solution{keep2 inner{text}} remove3';
$re = '/ \\\\solution ( \{ [^{}]* (?: (?1) [^{}]* )* \} ) [^{}\s]* /x';
preg_match_all($re, $text, $matches);
$text = join($matches[0]);
echo $text;
<强>输出强>
\solution{keep1}\solution{keep2 inner{text}}
答案 1 :(得分:0)
捕获您需要的文本然后内爆。
preg_match_all('#\solution\{[^\}]*\}#msi', $text, $matches);
$text = implode($matches[0],'');