使用正则表达式挑选文本

时间:2012-03-11 19:41:30

标签: php regex preg-replace

我有

$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);

但这并没有将解决方案放在前面。我该如何解决这个问题?

编辑:\解决方案是一个要搜索的固定字符串,所有其他文本片段都是任意的。

2 个答案:

答案 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],'');